2010-12-14 9 views
6

W iOS4.2/iPhone4Jak sprawdzić, czy widok UIViewController jest wyświetlany po przejściu w tle?

  • Kliknij ikonę, aby uruchomić aplikację (wyświetlany jest jakiś widok widok kontrolery)
  • Kliknij przycisk iPhone Home (powrót do ekranu home)
  • podwójne kliknięcie przycisku Start
  • Wybierz wcześniej uruchomił aplikację z wybór

teraz widzę, że moim app delegate otrzymuje komunikat "applicationDidBecomeActive", gdy jest wybrany po ostatnim kroku, ale jak działa mój viewController (ten, którego widok jest aktualnie wyświetlany)?

viewDidLoad został już wywołany, więc nie jest wywoływany ponownie. viewWillLoad nie jest ponownie wywoływany.

Nie mogę tego rozgryźć. Powód, dla którego pytam, to chcę sprawdzić, czy wprowadzono jakiekolwiek zmiany w Ustawieniach, ale chciałbym to zrobić w kontrolerze widoku, bo to jest to, o co dba.

Odpowiedz

5

w jesteś appDelegate applicationDidBecomeActive umieścić to:

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    UINavigationController *navc = (UINavigationController *)[tabBarController selectedViewController]; 

    UIViewController *topvc = [navc topViewController]; 

    if ([topvc respondsToSelector:@selector(viewControllerDidBecomeActive)]) 
    { 
     [topvc performSelector:@selector(viewControllerDidBecomeActive)]; 
    } 
} 

ten dostaje viewController który jest widoczny na ekranie. Po prostu musisz zaimplementować viewControllerDidBecomeActive na każdym widoku Kontrolery;)

+0

Dobrze, tego rodzaju prace, ale nie dokładnie to, czego szukałem. Moja hierarchia widoków jest nieco bardziej złożona, więc Twój opublikowany kod nie działa tak jak jest, ale mam pomysł i mogę to zrobić w ten sposób. Jest to zdecydowanie jedna droga. Sądzę, że miałem nadzieję, że coś przeoczyłem i że istnieje bardziej bezpośredni sposób, niezależny od jakiejkolwiek hierarchii kontrolerów widoku. – Fraggle

+0

Kilka lat później, ale AFAICS, najlepszą opcją byłoby użycie NSNotificationCenter. –

0

W aplikacji appDelegateDidBecomeActive ustawiono właściwość boolean oznaczającą, że właśnie pojawiła się ona w tle.

Następnie w swoim kontroler widoku, w szczególności nadpisanie viewDidAppear, sprawdź właściwość appDelegate, jeśli jest to prawda, to wiesz, że pochodzi z tła, w przeciwnym razie po prostu pojawił się normalnie. BTW Następnie, ustaw właściwość boolean na false dla schludności.

EDIT- Musisz wywołać viewDidAppear ręcznie w applicationDidBecomeActive, chyba że ponownie tworzyłeś swój stos nawigacyjny. Jeśli udało się uzyskać wskaźnik do bieżącego kontrolera widocznego widoku, wówczas wywoływanie metody viewDidAppear powinno być podejściem bez żadnych problemów, ponieważ wszystkie kontrolery widoku mają tę metodę. Dzięki temu nie trzeba żadnych delegatów lub itp

+0

No nie, to nie robi. Widok już się pojawił. Potem ktoś idzie i zmienia niektóre ustawienia, a następnie wraca do aplikacji. Zwykle na iOS 4 tak czy inaczej viewDidAppear nie zostanie ponownie wywołany, prawda? – Fraggle

+0

Ach, przepraszam, twoja prawda! Zapomniałem w swoich aplikacjach, że robię rzeczy na stos nawigacyjny w applicationDidBecomeActive.Jeśli masz wskaźnik do bieżącego widocznego kontrolera widoku, możesz po prostu wywołać funkcję wewnątrz twojego widoku, mówiąc mu, żeby sprawdzić, czy coś się zmieniło, ale to w zasadzie takie samo jak odpowiedź Tomasza, ale bez elegancji delegatów. – Rob

Powiązane problemy