2009-07-02 9 views
7

¿Hay alguna manera de que un UIViewController (dentro de una pila de navegación) detecte si está apareciendo porque se realizó un desglose o un desglose?UIViewController: detección de desgloses y profundización

En viewWillAppear, topViewController y visibleViewController de UINavigationController ya están configurados en el nuevo ViewController, desafortunadamente.

+0

He estado luchando con esto, también. Esperaba crear una clase de ayuda y convertirla en el "UINavigationControllerDelegate" de mi "pila", y luego mirar a través de "navigationController: willShowViewController:" pero hay dos problemas: 1) parece que se llama incluso cuando no está presionado (como tabular sobre esa pila - que parece sospechoso) y 2) esto se llama DESPUÉS de la vista del controlador relacionado, aparecerá, que me causa problemas de lógica, ya que necesito saber si estoy en la misma pila antes de que aparezca la vista. Solo estoy señalando esto porque este enfoque parecía elegante, pero era un callejón sin salida. –

Respuesta

0

¿No pudo ver la propiedad viewControllers en el controlador de navegación?

+1

Me temo que no. El controlador de vista actual siempre será el último elemento de la matriz. No se puede detectar si esto sucedió como resultado de haber sido empujado o haber saltado otro controlador. :( – Norman

5

Podría subclase UINavigationController y agregar una propiedad didPushViewController. Luego puede anular pushViewController y popViewController para establecer correctamente la propiedad en verdadero o falso, respectivamente.

+0

Suena bien. Simplemente pensé que había una manera más fácil que pasé por alto. Gracias. – Norman

1

¿Simplemente necesita saber cuáles serán los controles de visualización anterior y siguiente? ¿O necesita saber específicamente si un controlador de vista se abrió o presionó? Se puede aplicar el siguiente método, que se define por UINavigationControllerDelegate:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    UIViewController * currentController = navigationController.visibleViewController; 
    UIViewController * nextController = viewController; 

    // Do whatever here. 
} 

Si, sin embargo, sí es necesario saber si un controlador de vista particular, se hizo estallar o empujado, entonces la sugerencia Matt Bridges es el camino a seguir.

2

Otra forma es esconder los controles de vista a los que está profundizando como variables locales de clase; luego, en viewWillAppear, sabe que recibió un golpe debido a una ampliación si todavía se establece alguna de las variables locales de clase. Incluso sabe de qué controlador regresó el usuario, por lo que puede hacer una lógica diferente (como buscar valores modificados de los controladores de vista a los que profundizó).

No olvides soltar y anular las referencias en la vista Aparecerán para que el sistema se restablezca y vuelva a reconocer las cosas correctamente.

Me gusta más este mecanismo que tener los controladores detallados sobre la vista maestra como un delegado para enviar cambios, ya que a menudo están trabajando en un pequeño trozo de datos separados y no deberían tener que saber acerca de un controlador de vista maestro completo. Los hace más fáciles de reutilizar también, ya que pueden ser llamados por muchas clases diferentes.