2013-07-30 19 views
12

Lavoro su un'applicazione legacy e ho scoperto che i miei metodi view[Will/Did]Disappear non vengono sempre attivati ​​correttamente.viewWillDisappear not call quando si chiama popToRootViewControllerAnimated

Il caso è, ho un (personalizzato) UIViewController impostato come rootViewController in AppDelegate. Questo rootViewController ha un UINavigationController, su cui sono spinti due controller di visualizzazione. Quando l'utente preme il pulsante home, l'utente viene disconnesso. Quando più tardi torna a l'applicazione, l'applicazione chiama [UINavigationController popToRootViewControllerAnimated:YES] e quindi visualizza un modale UIViewController per il login

Il problema è:. Quando premo/pop sul UINavigationController normalmente, il mio metodo viewWillDisappear si chiama correttamente. Tuttavia, quando utilizzo il metodo popToRootViewControllerAnimated:, viewWillDisappear non viene richiamato su nessuno dei viewControllers che vengono estratti.

ricerca su internet ha dato solo due possibili ragioni:

Nessuno di questi suggerimenti sono il caso nella mia app. E non ho idea di dove guardare. Qualcuno ha un suggerimento su cosa è stato fatto di sbagliato nell'app?

+0

buona scoperta :). Grazie! – GoGreen

risposta

16

La vista probabilmente non era sullo schermo. Deve essere sullo schermo (visibile) per il metodo viewWillDisappear: da chiamare. Se sta tornando dallo sfondo, non era visibile.

Si potrebbe provare a utilizzare willMoveToParentViewController: che viene chiamato quando il controller di visualizzazione viene rimosso dal suo genitore.

+0

Questo è un suggerimento molto interessante! Ora ho provato a usare popToRootViewController in un'altra posizione nell'app, quindi la mia viewWillDisappear viene chiamata come previsto, quindi hai ragione finora. Tuttavia, ho anche provato a creare un'app di test, con esattamente la mia configurazione, in cui 'popToRootViewControllerAnimated:' è chiamato da AppDelegate 'applicationDidBecomeActive:'. Qui viene anche chiamato il metodo 'viewWillDisappear:'. Questo suggerisce ancora, che dovrebbe essere chiamato, ma qualcosa non va nella mia app. – JRV

+1

Il motivo per cui ciò si è verificato è che stavo presentando un controller di visualizzazione modale quando veniva chiamato il metodo 'applicationDidBecomeActive:' (subito dopo aver chiamato 'popToRootViewControllerAnimated:'). Quindi la tua risposta era corretta - la vista apparentemente era fuori dallo schermo quando l'app è stata lanciata. – JRV

+1

Dopo aver risolto questo problema con il supporto tecnico di Apple, si è verificato un bug in iOS (e compare sia in 6 che in 7 Beta 5). Ho presentato una segnalazione di bug ad Apple. Ti do un +1 per il buon suggerimento usando 'willMoveToParentViewController' come soluzione :-) – JRV

0

così utile a me

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

ho riscritto 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]; 
     } 
    }); 

}

Problemi correlati