2013-07-30 12 views
12

Pracuję nad starszą aplikacją i dowiedziałem się, że moje metody view[Will/Did]Disappear nie zawsze są uruchamiane prawidłowo.viewWillDisappear nie wywoływane podczas wywoływania popToRootViewControllerAnimated

Sprawa jest, mam (niestandardowy) UIViewController ustawiony jako rootViewController w AppDelegate. To rootViewController ma UINavigationController, który ma dwa kontrolery widoku wciśnięty na nim. Gdy użytkownik naciśnie przycisk strony głównej, użytkownik jest wylogowywany. Kiedy później powraca do aplikacji, aplikacja wywołuje [UINavigationController popToRootViewControllerAnimated:YES] a następnie wyświetla modalne UIViewController do logowania

Problem jest gdy, np. Wciskam/pop na UINavigationController normalnie, moja metoda viewWillDisappear nazywa się prawidłowo. Ale kiedy używam metody popToRootViewControllerAnimated:, viewWillDisappear nie jest wywoływana w żadnym z wyświetlanych kontrolerów viewController.

wyszukiwania w internecie dał tylko dwa możliwe powody:

Żadna z tych propozycji są przypadek w mojej aplikacji. I nie mam pojęcia, gdzie szukać. Ktoś ma sugestię, co zostało zrobione źle w aplikacji?

+0

dobre znalezisko :). Dzięki! – GoGreen

Odpowiedz

16

Widok prawdopodobnie nie był wyświetlany na ekranie. Musi być na ekranie (widoczny), aby można było wywołać metodę viewWillDisappear:. Jeśli wraca z tła, nie było widać.

Można spróbować użyć funkcji willMoveToParentViewController:, która jest wywoływana, gdy kontroler widoku zostanie usunięty z obiektu nadrzędnego.

+0

To bardzo interesująca propozycja! Próbowałem teraz używać popToRootViewController w innym miejscu w aplikacji, a następnie mój viewWillDisappear są wywoływane zgodnie z oczekiwaniami, więc masz rację do tej pory. Jednak próbowałem także stworzyć aplikację testową, z dokładnie moją konfiguracją, w której 'popToRootViewControllerAnimated:' jest wywoływane z 'applicationDidBecomeActive: AppDelegate '. Tutaj również wywoływana jest metoda 'viewWillDisappear:'. To nadal sugeruje, że powinno się to nazywać, ale coś jest nie tak z moją aplikacją. – JRV

+1

Powodem tego stało się, że przedstawiłem kontroler widoku modalnego, gdy wywołano metodę 'applicationDidBecomeActive:' (zaraz po wywołaniu 'popToRootViewControllerAnimated:'). Twoja odpowiedź była prawidłowa - widok najwyraźniej zniknął z ekranu po uruchomieniu aplikacji. – JRV

+1

Po zgłoszeniu tego problemu z pomocą techniczną firmy Apple, okazało się, że jest to błąd w systemie iOS (i pojawia się zarówno w 6, jak i 7 Beta 5). Złożyłem zgłoszenie błędu do firmy Apple. Daję ci +1 za dobrą sugestię, używając 'willMoveToParentViewController' jako obejścia :-) – JRV

0

takie użyteczne dla mnie

[nav performSelector:@selector(popToRootViewControllerAnimated:) withObject:nil afterDelay:0.0]; 

przepisałem UITabBarController

- (void)setSelectedIndex:(NSUInteger)selectedIndex { 

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
     UINavigationController *navigationController = [originalViewController as:[UINavigationController class]]; 
     if (navigationController.presentedViewController) { 
      [navigationController dismissViewControllerAnimated:NO completion:^{ 
       [navigationController popToRootViewControllerAnimated:NO]; 
      }]; 
     }else if (navigationController.topViewController){ 
      [navigationController popToRootViewControllerAnimated:NO]; 
     } 
    }); 

}

Powiązane problemy