example - lifecycle viewcontroller ios
viewWillDisappear no se invocó al llamar a popToRootViewControllerAnimated (2)
La vista probablemente no estaba en la pantalla. Tiene que estar en pantalla (visible) para que se viewWillDisappear:
método viewWillDisappear:
. Si vuelve desde el fondo, no fue visible.
Podría intentar usar willMoveToParentViewController:
que se llama cuando el controlador de vista se elimina de su principal.
Trabajo en una aplicación heredada y descubrí que mis métodos de view[Will/Did]Disappear
no siempre se activan correctamente.
El caso es que tengo un UIViewController
(personalizado) configurado como rootViewController en AppDelegate. Este controlador raíz tiene un UINavigationController
, que tiene dos controles de vista empujados sobre él. Cuando el usuario presiona el botón de inicio, el usuario se desconecta. Cuando más tarde regresa a la aplicación, la aplicación llama a [UINavigationController popToRootViewControllerAnimated:YES]
y luego muestra un UIViewController
modal para iniciar sesión.
El problema es: cuando UINavigationController
/ pop en el UINavigationController
normalmente, mi método viewWillDisappear
se llama correctamente. Pero cuando uso el método popToRootViewControllerAnimated:
viewWillDisappear
no se viewWillDisappear
en ninguno de los viewControllers que se quitan.
La búsqueda en Internet solo ha dado dos posibles razones:
- Si usa un UINavigationController como una subvista, debe llamar a
view[Will/Did]Disappear
usted mismo - No llamar a los súper métodos adecuados
Ninguna de estas sugerencias es el caso en mi aplicación. Y no tengo idea de dónde mirar. ¿Alguien tiene una sugerencia sobre lo que se ha hecho mal en la aplicación?
tan útil para mí
[nav performSelector:@selector(popToRootViewControllerAnimated:) withObject:nil afterDelay:0.0];
Reescribí 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];
}
});
}