2012-01-18 12 views
5

Ho bisogno di un piccolo aiuto su un problema con i controller di navigazione.popToRootViewControllerAnimated non visualizza il controller di visualizzazione root

Ho un navigationController con 4 ViewControllers spinto. L'ultimo vc I push presenta un ulteriore ViewController modally. Il modale ViewController presenta uno ActionSheet. A seconda della risposta dell'utente, ignoro il modale ViewController o voglio tornare alla radice ViewController.

Nel ViewController presentato modale che ho:

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

Nell'ultimo ViewController inseriti nello navigationController pila ho:

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

Respingendo la vista modale di controllo funziona bene. Tuttavia,

[self.navigationController popToRootViewControllerAnimated:NO]; 

non causa la radice ViewController per visualizzarne le viste. Aggiunta di alcune informazioni di registro Vedo che dopo il messaggio a self.navigationController lo stack è stato estratto correttamente ma l'esecuzione continua in sequenza. Lo schermo mostra ancora la vista del modale ViewController.

Come soluzione alternativa, ho provato a eliminare sempre il controller di visualizzazione modale e nel metodo ViewWillAppear il messaggio popToRootAnimated. Nessuna differenza. Ancora la pila di controller è spuntata ma lo schermo continua a mostrare la vista del mio controller di visualizzazione modale e l'esecuzione continua in sequenza.

Qualcuno potrebbe aiutarmi per favore?

+0

hai provato a eseguire il debug con il punto di interruzione che il tuo compilatore entra in loop? – Hiren

risposta

6

Mi piacciono queste domande ingannevoli. Sembra molto semplice, finché non provi a farlo.

Quello che ho trovato è che in pratica è necessario chiudere il controller di visualizzazione modale, ma se si tenta di eseguire il pop dal controller di navigazione nella riga successiva, le cose si confondono. Devi assicurarti che il respingimento sia completo prima di tentare il pop. In iOS 5 puoi utilizzare dismissViewControllerAnimated:completion: in questo modo.

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

Ma vedo che hai 4.0 nei tag domanda. La soluzione che ho trovato per <iOS 5 è molto meno carina ma dovrebbe comunque funzionare, e sembra che tu fossi già sulla pista. Si desidera viewDidAppear: non viewWillAppear:. La mia soluzione qui comporta un Ivar, diciamo:

BOOL shouldPopToRootOnAppear; 

E poi il tuo GameReportModalWillBeDismissed: sarebbe simile a questa:

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

E il tuo viewDidAppear: sarebbe simile a questa ...

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

ciao. Grande !!! Ha funzionato come un fascino. Grazie mille, sono passati più di 4 giorni a trafficare con il mio codice. Grazie ancora. – DanL

+0

Benvenuti in stackoverflow.com. Felice di aiutare. Se questa risposta risolvesse il tuo problema, dovresti accettarlo. – NJones

Problemi correlati