11

Desidero chiamare un nuovo controller di visualizzazione e rimuovere il controller di visualizzazione corrente dallo stack del controller di navigazione. Ad esempio. Sono nel controller di visualizzazione A e chiamo B.Come rimuovere una vista dal controller di navigazione

Ora ho nella pila A, B. Ora voglio chiamare C (da B). Voglio che lo stack sia A, C.

Grazie.

risposta

5

Questa è la risposta.

Il seguente codice apre il controller di visualizzazione corrente.

UINavigationController *navController = self.navigationController; 
// retain ourselves so that the controller will still exist once it's popped off 
[[self retain] autorelease]; 
[navController popViewControllerAnimated:NO]; 

E questo spinge il nuovo:

ViewControllerC *viewC = [[ViewControllerC alloc] init]; 
[navController pushViewController:viewC animated:TRUE]; 

Speranza che aiuta!

+2

Qualche idea su come farlo con ARC abilitato? Il compilatore non consente l'uso di 'retain' – asdasd

+1

@Oscar, vedere la mia soluzione, [di seguito] (http://stackoverflow.com/a/17328244/1431728). – JohnK

0

Penso che si possa fare questo facendo prima scoppiare B dallo stack di navigazione e quindi premere C in esso. Dovresti essere in grado di usare [UINavigationController popViewControllerAnimated] e [UINavigationController pushViewController: animated] per questo.

+0

Questo è corretto ma non completo. Alla fine funziona, ma devo conservare il controller prima di inserirlo, così posso spingere l'altra vista in seguito. UINavigationController * navController = self.navigationController; [autodel] autorelease]; [navController popViewControllerAnimated: NO]; – Tony

+0

In base al riferimento Apple, http://developer.apple.com/library/ios/#documentation/uikit/reference/UINavigationController_Class/Reference/Reference.html UINavigationController non è destinato alla sottoclasse. Perché una cosa così semplice è così complicata? – Tony

+0

@Tony Mio pessimo, me ne sono dimenticato. Ignorare il mio commento precedente e modificare. Li rimuoverò tutti ... – barley

4

Per rimuovere il secondo da-ultimo elemento navigazione:

NSMutableArray *navigationStack = [[NSMutableArray alloc] initWithArray: 
    self.navigationController.viewControllers]; 
[navigationStack removeObjectAtIndex:[navigationStack count] - 2]; 
self.navigationController.viewControllers = navigationStack; 

Ad esempio, eseguire questo da viewDidLoad sul regolatore C per rimuovere controllore B dalla pila di navigazione.

23

Nel contesto di ARC, ecco una possibile soluzione:

NSMutableArray* navArray = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers]; 
[navArray replaceObjectAtIndex:[navArray count]-1 withObject:nextViewController]; 
[self.navigationController setViewControllers:navArray animated:YES]; 

Come si può dire, questo codice sostituisce il codice spinta al solito nella vista si sta cercando di rimuovere dalla pila ("B" nella tua domanda). La riga 1 copia l'elenco di controller di visualizzazione dallo stack del controller di navigazione in uno NSMutableArray. La riga 2 sostituisce l'ultima (in alto) vista con la vista che vogliamo andare al prossimo ("C"). La riga 3 rende lo stack effettivo del controller di navigazione come il nostro array modificato, e anima la transizione all'elemento più in alto. (Naturalmente, non è possibile utilizzare questo codice nella viewController radice.)

ho trovato un modo alternativo here e adattato per ARC:

UINavigationController *navController = self.navigationController; 
[navController popViewControllerAnimated:NO]; 
[navController pushViewController:someViewController animated:YES]; 

La prima riga è necessario perché una volta che hai spuntato la vista corrente fuori dallo stack, self.navigationController, sarà nil e la terza riga non funzionerà. Stesso numero di linee del modo precedente, ma funziona in questo modo attraverso i metodi integrati invece di "manualmente" giocherellare con lo stack.

+0

Grazie per la tua seconda implementazione era esattamente quello che stavo cercando. – NMunro

+0

grazie, la spiegazione è eccellente! – Michael

-2

È possibile utilizzare questo codice.

NSMutableArray * navigationArray = [[NSMutableArray alloc] initWithArray: self.navigationController.viewControllers]; [navigationArray removeAllObjects]; self.navigationController.viewControllers = navigationArray;

Spero che funzioni per te.