ios objective-c uinavigationcontroller presentmodalviewcontroller appdelegate

ios - viewDidDisappear no llamado



objective-c uinavigationcontroller (1)

Trabajo en una aplicación, donde tengo un problema con mi vista [Will / Did] Desaparecen los métodos que no se activan al volver a la aplicación.

El caso es que tengo UINavigationController, que tiene dos controladores 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, se ejecuta el siguiente código (simplificado) en mi AppDelegate:

- (void)applicationDidBecomeActive:(UIApplication *)application { [(UINavigationController *)self.window.rootViewController popToRootViewControllerAnimated:NO]; [self.window.rootViewController presentModalViewController:loginViewController animated:NO]; }

Cuando selecciono los controladores de vista en mi pila de controlador de navegación, esperaría que los métodos de view[will|did]disappear . Sin embargo, este no es el caso, ya que (aparentemente) ya no están en la pantalla cuando iOS lanzará estos métodos. Parece que el controlador de vista modal se ha hecho cargo.

Si no presento el controlador de vista modal, los métodos view[will|did]disappear como se espera.

Mi pregunta es: si quiero view[will|did]disappear métodos de la view[will|did]disappear , ¿cómo puedo estructurar mi código? ¿Hay un lugar mejor para presentar mi inicio de sesión modalViewController?

Editar:

Para mostrar mis problemas más claramente, he creado un proyecto de prueba muy simple aquí: https://github.com/JohanVase/ModalViewCauseMissingViewDisappearCalls . Intente un par de veces seguir las instrucciones en la aplicación y asegúrese de que mis "recursos" no se publiquen en mi método viewWillDisappear.


Finalmente le pedí al soporte técnico de Apple la misma pregunta. Llegaron a la conclusión de que se trataba de un error en iOS, por lo que he presentado un informe de error a Apple. El mismo error parece aparecer en iOS 6 y en el último iOS 7 (Beta 5).

El soporte técnico de Apple sugirió lo siguiente:

Como solución alternativa, puede mover su código de limpieza a un método diferente que invocaría AppDelegate en el controlador de vista superior del controlador de navegación, antes de que aparezca toda la pila de navegación.

Sin embargo, creo que esto expone demasiado de mis detalles en el controlador de vista, así que elegí implementarlo usando willMoveToParentViewController: lugar. Este método se invoca cuando el controlador de vista se elimina de su elemento primario y se llama correctamente.