2009-06-16 8 views
10

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 notificaciones o recibir una llamada al método automático cuando el niño sale de la pila y el padre vuelve a ser visible?Cómo llamar automáticamente un método después de sacar un controlador de vista de la pila en el iPhone

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

Gracias por su ayuda!

Respuesta

13

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

Tengo un controlador de vista raíz que muestra el tamaño de una lista, llama a un controlador de vista secundaria que puede alterar el tamaño de una lista, y debe actualizar el tamaño a la devolución.

Cuando creo mi vista padre (SettingsView más adelante), y añadir a ella como la vista raíz de un UINavigationController, me aseguro de establecer el delegado del UINavigationController antes de que aparezca la vista - que es la parte clave:

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

En la vista de los padres, implementar el protocolo UINavigationControllerDelegate:

@interface SettingsView : UIViewController <UINavigationControllerDelegate> 

y proporcionar el método willShowViewController:

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

Esto se invoca después de que se cierra la vista secundaria y antes de que se vuelva a mostrar la vista principal.

+0

Wow gracias, tuve el mismo problema. – drew010

+0

No se olvidó de aceptar la respuesta correcta. –

+0

uestra observación fue muy importante ... la respuesta unforgiven3 es correcta, pero si no implementa el protocolo UINavigationControllerDelegate en ViewController donde su llamada willShowViewController nunca funcionará, y el ViewController padre seguirá quejándose de que envíe "ViewController __strong a parámetro de id. de tipo incompatible

6

Tuve la necesidad de hacer algo como esto también. En el ViewController que poseía mi UINavigationController, tenía que poner en práctica willShowViewController, así:

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

Ese método se llama cada vez que el UINavigationController cambia vistas. Si entiendo tu pregunta correctamente, creo que esto debería hacer lo que quieras.

3

Creo que hay algo de confusión aquí. UIView s no se presionan ni saltan de la pila UINavigationController. Lo que se está presionando y haciendo estallar 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; 

Estos son llamados cada vez que la vista está a punto de (des) aparece, o tiene solo (des) aparecido. Trabajo con barras de pestañas, vistas modales y controladores de navegación. (Y es una buena idea para hacer uso de ellos cuando se implementa controladores personalizados.)

Así, en su caso, si he entendido bien, usted simplemente tiene que anular el viewWillAppear: o viewDidAppear: método en lo que se llama el " página principal "(que presumiblemente se maneja con un UIViewController) y poner el código para actualizar la apariencia de la página para reflejar los datos que acabamos de ingresar.

(Si no recuerdo mal, usted debe asegurarse de que el UINavigationController obtiene un mensaje viewWill/DidAppear: cuando se muestra por primera vez, a fin de que estos mensajes sean enviados más tarde a sus controladores de niño. Si se establece este día con una plantilla o en IB probablemente no tenga que preocuparse por eso)

0

Si necesita notificar a un controlador a otro, puede usar el patrón de delegación como se describe en here (see 2nd answer).

Lamentablemente no hay notificaciones automáticas (AFAIK) para la tarea exacta que usted describió. Para satisfacer sus necesidades, puede enviar un mensaje para delegar (es decir, a su controlador principal) en viewWillDisappear función de su controlador hijo.

+1

que es engorroso si el controlador de su hijo tiene un hijo. En ese caso, se llama a 'viewWillDisappear' cuando el hijo empuja al nieto y cuando el niño aparece. Solo en este último caso le gustaría enviar un mensaje al padre. Todavía tengo que encontrar una forma elegante de salir de ese problema. –

2

La respuesta de Felixyz hizo el truco para mí. Al llamar a la vista aparecerá el método ejecutará el código cada vez que aparezca la vista. A diferencia de view, load, que ejecuta su código solo cuando la vista se carga por primera vez. Por lo tanto, su vista principal no se actualizaría automáticamente si una vista secundaria alteraba la información que se mostraba en el elemento primario y luego se quitaba el saco. Pero si aparece la vista de llamadas de los padres, el código se ejecutará cada vez que la vista muestre una copia de seguridad.

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

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