Cómo llamar automáticamente a un método después de sacar un controlador de vista de la pila en el iPhone

StackOverflow https://stackoverflow.com/questions/1001441

  •  05-07-2019
  •  | 
  •  

Pregunta

Necesito actualizar la vista principal en un iPhone después de sacar una vista secundaria de la pila de navegación. ¿Cómo puedo configurar la vista principal para recibir una notificación o recibir una llamada de método automática cuando el niño se saca de la pila y el padre vuelve a estar visible?

El usuario ingresa los datos en la página secundaria que quiero mostrar en la página principal después de que el usuario termina y aparece la vista.

¡Gracias por tu ayuda!

¿Fue útil?

Solución

Acabo de resolver este mismo problema, y ??las respuestas anteriores son casi correctas, simplemente se olvidaron de configurar al delegado.

Tengo un controlador de vista raíz que muestra el tamaño de una lista, llama a un controlador de vista secundario que puede alterar el tamaño de una lista y debo actualizar el tamaño al regresar.

Cuando creo mi vista principal (vista de configuración a continuación), y la agrego como la vista raíz de un UINavigationController, me aseguro de configurar el delegado de UINavigationController antes de mostrar la vista, esa es la parte clave:

SettingsView *sv = [[SettingsView alloc] initWithNibName:@"SettingsView" bundle:nil];
UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:sv];
[nc setDelegate:sv];

En la vista principal, implemente el protocolo UINavigationControllerDelegate:

@interface SettingsView : UIViewController <UINavigationControllerDelegate>

y proporcione el método willShowViewController:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    // Your code to update the parent view
}

Se llama después de que se descarta la vista secundaria y antes de que se vuelva a mostrar la vista principal.

Otros consejos

También tuve la necesidad de hacer algo como esto. En el ViewController que era propietario de mi UINavigationController , tuve que implementar willShowViewController , como esto:

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

Se llama a ese método cada vez que UINavigationController cambia las vistas. Si estoy entendiendo tu pregunta correctamente, creo que esto debería hacer lo que quieres.

Creo que hay algo de confusión aquí. Los UIView no se insertan ni se extraen de la pila de UINavigationController . Lo que se está empujando y desplegando es UIViewControllers , que a su vez maneja una o (más a menudo) varias vistas cada una.

Afortunadamente, el UIViewController tiene estos métodos:

-(void) viewWillAppear:(BOOL)animated;
-(void) viewDidAppear:(BOOL)animated;
-(void) viewWillDisappear:(BOOL)animated;
-(void) viewDidDisappear:(BOOL)animated;

Se llaman cuando la vista está a punto de (dis) aparecer, o simplemente ha (dis) aparecido. Trabajo con barras de pestañas, vistas modales y controles de navegación. (Y es una buena idea hacer uso de estos cuando implementas controladores personalizados).

Por lo tanto, en su caso, si lo entiendo correctamente, simplemente tiene que anular el método viewWillAppear : o viewDidAppear : en lo que usted llama "página principal" " (que presumiblemente se maneja con un UIViewController ) y se coloca en un código para actualizar la apariencia de la página para reflejar los datos que se acaban de ingresar.

(Si recuerdo correctamente, debe asegurarse de que el UINavigationController reciba un mensaje viewWill / DidAppear: cuando se muestre por primera vez, para que estos mensajes se puedan ver más adelante. ser enviado a sus controladores secundarios. Si configura esto con una plantilla o en IB probablemente no tenga que preocuparse por eso.)

La respuesta de Felixyz hizo el truco para mí. Al aparecer la vista, aparecerá un método que ejecutará el código cada vez que aparezca la vista. Se cargó una vista diferente a la vista, que ejecuta su código solo cuando la vista se carga por primera vez. Por lo tanto, su vista principal no se actualizaría a sí misma si una vista secundaria modificara la información que se muestra en el elemento principal y luego se sacó de la bolsa. Pero si aparece la vista de llamadas de los padres, el código se ejecuta cada vez que la vista muestra una copia de seguridad.

Asegúrate de llamar al súper método al mismo tiempo. La implementación adecuada se vería así:

- (void)viewWillAppear:(BOOL)animated
{
   [super viewWillAppear:animated];
    NSLog(@"View Appearing");
}

Si necesita notificar un controlador a otro, puede usar el patrón de delegación como se describe aquí (ver segunda respuesta) .

Lamentablemente, no hay una notificación automática (AFAIK) para la tarea exacta que describiste. Para satisfacer sus necesidades, puede enviar un mensaje a un delegado (es decir, a su controlador principal) en la función viewWillDisappear de su controlador secundario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top