15

Digamos que tengo 2 UIViewControllers en una pila dentro de un UINavigationController. En el "padre" llamamos "[self.navigationController pushViewController: childViewController animado: YES];" sobre alguna acción del usuario y en el "niño" llamamos "[self.navigationController popViewControllerAnimated: YES];" sobre alguna acción del usuario.iOS: ¿Cómo reconocer que obtuvimos de un niño UIViewController dentro del Parent UIViewController?

¿Cómo podemos reconocer dentro del padre que acabamos de recibir?

¿Existe algún método "evento" que pueda reconocer que esta acción popViewControllerAnimated fue llamada desde el elemento secundario?

Respuesta

0

primero lea this, que le ayudará a entender lo que está pasando con los controladores de vista.

A continuación, poner en práctica y viewWillAppear:viewDidAppear: en su controlador de vista de los padres a registrar un mensaje.

+1

Esto no le dice, sin embargo, que otro controlador se ha reventado. Puede haber varios diferentes. Pero no en un momento en un estado empujado, por supuesto, entonces el OP simplemente puede hacer un seguimiento de qué controlador fue empujado al último. –

1

Hay algunas formas de insinuar eso. Lo que puede hacer es llamar al popViewControllerAnimated desde el padre. Puede hacerlo pasando un block al controlador secundario que luego ejecutaría dicho bloque y, por lo tanto, el controlador principal lo haría.

También puede utilizar el delegado UINavigationController para ser notificado cuando se desestimó una UIViewController:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated; 

Este método le permitirá saber lo que se mostrará VC y se puede comprobar si la corriente (todavía no está hecho estallar) VC es el niño que estabas buscando.

También puede hacer algún truco con - (void) viewWillAppear: pero esto podría requerir algunos hacks.

6

Parece que está utilizando este controlador para niños como un modal en el sentido de que se puede 'descartar'. Si ese es el caso, intente seguir los patrones de Apple que usan para UIAlertViews.

Si ese fuera el caso, haría cualquiera de las siguientes acciones para implementar un patrón de delegado (delegar frente a bloque es un gran debate que no abordaré aquí) para que el propietario (el que empuja al niño) sabe cuando su despedidos:

  • crear un protocolo (ChildControllerDelegate), han un método en el que childControllerWasDismissed: (ChildController *)
  • añadir un alojamiento bloque (asegúrese de que es una propiedad de copia, no retener) a la ChildController

t que Usted Si desea llamar al método delegado o bloquear en viewDidDisappear. Si desea un control de grano más fino, tenga un método o bloque delegado que corresponda a viewWillDisappear/viewDidDisappear.

3

Lo resolví exitosamente configurando navigationController?.delegate = self y luego implementando este método para determinar si el controlador de vista actual se muestra nuevamente después de un pop.

func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) { 
     if viewController == self { 
      // we got back 
     } else { 
      // some other controller was pushed 
     } 
    } 
Cuestiones relacionadas