2009-07-14 12 views
24

Ho uno UINavigationController con una serie di UIViewControllers su di esso. In alcune circostanze, voglio tornare esattamente a due livelli. Ho pensato di poterlo fare chiamando lo popViewControllerAnimated due volte di seguito, ma si scopre che la seconda volta che lo chiamo, non sta spuntando nulla e invece restituisce NULL. Devo memorizzare un riferimento al mio VC di destinazione e chiamare invece popToViewControllerAnimated? Posso farlo, ma complica il mio codice dato che dovrei passare lo UIViewController * in giro mentre sto spingendo i VC nello stack.Chiamata popViewControllerAnimated twice

Ecco il frammento di rilevante:

UIViewController* one = [self.navigationController popViewControllerAnimated:YES]; 
if (...) { 
    // pop twice if we were doing XYZ 
    UIViewController *two = [self.navigationController popViewControllerAnimated:YES]; 
    // stored in "one" and "two" for debugging, "two" is always 0 here. 
} 

sto facendo qualcosa di strano qui? Voglio scrivere un codice idiomatico, quindi se il modo "giusto" è chiamare popToViewControllerAnimated, o qualcos'altro interamente, lo cambierò felicemente.

risposta

63

In questo caso si avrebbe bisogno di pop torna a un viewcontroller specifico nel navigationController in questo modo:

[self.navigationController popToViewController:[[self.navigationController viewControllers] objectAtIndex:2] animated:YES]; 

Quel codice sarebbe pop alla terza viewcontroller sul stack del navigationController.

+1

oooh, credo di poter fare quel lavoro per me senza dover passare i puntatori viewController intorno. Grazie! –

+4

Come una FYI, ho dovuto usare viewControllers.count - 3 per tornare indietro di due. vc.count - 1 è la vista dall'alto, e due indietro da -3. –

+1

Perfetto! Sapevi anche che volevo andare al 3 ° viewcontroller: tutto quello che dovevo fare era tagliare e incollare. Grazie. –

19

Penso sia meglio contare il numero di controller di visualizzazione nello stack e quindi sottrarre il numero di controller di visualizzazione che si desidera visualizzare.

NSInteger noOfViewControllers = [self.navigationController.viewControllers count]; 
[self.navigationController 
popToViewController:[self.navigationController.viewControllers 
objectAtIndex:(noOfViewControllers-2)] animated:YES]; 

Con questa soluzione non si incasina il pop se si aggiunge una nuova vista al progetto in un secondo momento.

+3

I controller di visualizzazione sono da 0 a (noOfViewControllers-1). Pertanto il controller della vista corrente è (noOfViewControllers-1). (noOfViewControllers-2) è equivalente a popViewController. Per tornare indietro utilizzare 2 controller di visualizzazione (noOfViewControllers-3). –

+0

@Flatron Una piccola modifica alla tua risposta dovrà essere questa per 2 livelli poiché il conteggio non terrà conto del posizionamento 0 come fa objectAtIndex: NSInteger noOfViewControllers = [self.navigationController.viewControllers count] -1; [self.navigationController popToViewController: [self.navigationController.viewControllers objectAtIndex: (noOfViewControllers-2)] animato: YES]; – wilforeal

+0

Grazie per la risposta suite –

1

Inoltre, per quanto riguarda ciò che stavi facendo male, credo che il motivo per cui [self.navigationController popViewControllerAnimated:YES] non funzioni la seconda volta è perché probabilmente stai effettuando questa seconda chiamata sullo schermo che è stato inserito nella prima chiamata. Dopo la prima chiamata, la vista corrente viene rimossa dal controller di navigazione, quindi al momento della seconda chiamata, self.navigationController restituirà zero perché non ha più un controller di navigazione.

2

Funziona per me se si salva il riferimento alla UINavigationViewController e utilizza l'istanza salvato:

UINavigationViewController* savedUinvc = self.navigationController; 
UIViewController* one = [savedUinvc popViewControllerAnimated:YES]; 
if (...) { 
    // pop twice if we were doing XYZ 
    UIViewController *two = [savedUinvc popViewControllerAnimated:YES]; 
    // stored in "one" and "two" for debugging, "two" is always 0 here. 
} 
+0

ha funzionato anche per me come te - ma non ho idea del perché ...? hai scoperto alla fine? – geebee

Problemi correlati