2012-01-18 33 views
5

Necesito un poco de ayuda sobre un problema con los controladores de navegación.popToRootViewControllerAnimated no muestra el controlador de vista raíz

Tengo un navigationController con 4 ViewControllers empujado. El último vc I push presenta un ViewController adicional de forma modal. El modal ViewController presenta un ActionSheet. Dependiendo de la respuesta del usuario, descarto el modal ViewController solamente o quiero volver al directorio raíz ViewController.

En el ViewController presentado de forma modal que tengo:

- (void) dismissGameReport 
{  
    [[self delegate] GameReportModalWillBeDismissed:modalToPopToRoot];  
} 

En el último ViewController inserta en la pila navigationController tengo:

- (void)GameReportModalWillBeDismissed: (BOOL)popToRoot; 
{  
    if (popToRoot) 
     { 
     [self.navigationController popToRootViewControllerAnimated:NO]; 
     } 
    else 
     { 
     [self dismissModalViewControllerAnimated:YES]; 
     }    
} 

Descartando la vista modal controlador funciona bien. Sin embargo,

[self.navigationController popToRootViewControllerAnimated:NO]; 

no causa la raíz ViewController para mostrar sus puntos de vista. Agregando un poco de información de registro veo que después del mensaje a self.navigationController la pila aparece correctamente pero la ejecución continúa secuencialmente. La pantalla aún muestra la vista del ViewController modal.

Como solución probé siempre descartar el controlador de vista modal y en el método ViewWillAppear tengo el mensaje popToRootAnimated. Ninguna diferencia. Aún así, la pila de controladores aparece, pero la pantalla continúa mostrando la vista de mi controlador de vista modal y la ejecución continúa secuencialmente.

¿Alguien podría ayudarme por favor?

+0

¿Has intentado depurar con punto de interrupción al que entra tu compilador en el ciclo? – Hiren

Respuesta

6

Me gustan estas preguntas engañosas. Parece muy simple, hasta que intentes hacerlo.

Lo que encontré fue que, básicamente, es necesario descartar ese controlador de vista modal, pero si intenta abrirlo desde el controlador de navegación en la línea siguiente, las cosas se mezclan. Debe asegurarse de que el descarte esté completo antes de intentar el pop. En iOS 5 puedes usar dismissViewControllerAnimated:completion: como tal.

-(void)GameReportModalWillBeDismissed:(BOOL)popToRoot{  
    if (popToRoot){ 
     [self dismissViewControllerAnimated:YES completion:^{ 
      [self.navigationController popToRootViewControllerAnimated:YES]; 
     }]; 
    } 
    else{ 
     [self dismissModalViewControllerAnimated:YES]; 
    }    
} 

Pero veo que tiene 4.0 en las etiquetas de su pregunta. La solución que encontré para <iOS 5 es mucho menos bonita, pero aún debería funcionar, y parece que ya estaba en el camino. Desea viewDidAppear: no viewWillAppear:. Mi solución a este problema implica una Ivar, digamos:

BOOL shouldPopToRootOnAppear; 

Y entonces su GameReportModalWillBeDismissed: sería algo como esto:

-(void)GameReportModalWillBeDismissed:(BOOL)popToRoot{  
    shouldPopToRootOnAppear = popToRoot; 
    [self dismissModalViewControllerAnimated:YES];   
} 

Y su viewDidAppear: se vería así ...

-(void)viewDidAppear:(BOOL)animated{ 
    [super viewDidAppear:animated]; 
    if (shouldPopToRootOnAppear){ 
     [self.navigationController popToRootViewControllerAnimated:YES]; 
     return; 
    } 
    // Normal viewDidAppear: stuff here 
} 
+0

hola. Excelente !!! Funcionó a las mil maravillas. Muchas gracias, pasaron más de 4 días jugando con mi código. Gracias de nuevo. – DanL

+0

Bienvenido a stackoverflow.com. Encantado de ayudar. Si esta respuesta resolvió su problema, debe aceptarlo. – NJones

Cuestiones relacionadas