2012-04-04 20 views
45

Ho una vista su uno storyboard con un pulsante per eseguire una determinata azione. Tuttavia, per eseguire questa azione, è necessario che l'utente abbia effettuato l'accesso. Il gestore di pulsanti verifica se l'utente ha effettuato l'accesso ed esegue un passaggio se SÌ e un altro se NO. Il NO segue passa a un controller di visualizzazione di accesso. C'è un altro seguito che si collega al primo controller della vista, quindi se l'accesso è riuscito, l'utente può riprendere da dove avevano lasciato. I controller di visualizzazione sono incorporati in un controller di navigazione.Come tornare a un UIViewController già caricato?

Il problema è che il 'ritorno' segue sta caricando un'intera nuova istanza del controller di visualizzazione e non fa riferimento all'istanza origional, quindi alla fine ho a disposizione elementi di interfaccia vuoti e 2 copie di quel controller di visualizzazione in memoria.

Come posso tornare all'istanza originale del controller di visualizzazione?

risposta

135

Supponendo che si usi "push" si intende che si sta utilizzando un UINavigationController, quindi è possibile utilizzare il seguente per tornare all'inizio dello stack.

[self.navigationController popToRootViewControllerAnimated:YES]; 

o

UIViewController *prevVC = [self.navigationController.viewControllers objectAtIndex:<n>]; 
[self.navigationController popToViewController:prevVC animated:YES]; 

al pop a un livello specifico in cui <n> è il livello.

o

[self.navigationController popViewControllerAnimated:YES]; 

Se si desidera solo per pop di un livello indietro lo stack di navigazione.

+1

Ho un UIBarButton che viene inizialmente caricato in ViewDidLoad nella schermata precedente (quella a cui stiamo tornando). Quando uso il tuo codice, UIBar non mostra affatto. Qualche idea del perché? – c0d3Junk13

33

Invece di utilizzare un passaggio per tornare al controller precedente, è necessario utilizzare l'evento associato al follow che torna a ignorare il controller di visualizzazione corrente (se il passaggio era modale) o farlo scorrere dal controller di navigazione (se il seguito è stato premuto) e il controller precedente verrà visualizzato automaticamente.

Ad esempio, se il passaggio modale che viene eseguito è stato eseguito quando si preme un pulsante nella schermata di accesso, si elimina il seguito dallo storyboard e il ritocco all'interno dell'evento del pulsante collegato alla propria azione che , al momento del login di successo chiamerà:

[self dismissViewControllerAnimated:YES completion:nil]; 

Nello storyboard, si fare clic destro sul pulsante e trascinare il ritocco evento all'interno inviato alla first responder della scena vista del regolatore. Questo eseguirà la transizione inversa che è stata eseguita quando hai eseguito la transizione di seguito. È possibile utilizzare un seguito modale per questo, non è necessario utilizzare un controller di navigazione.

Se è stata spostata la vista di accesso sul controller di navigazione, è necessario estrarla dallo stack (se si ritorna alla visualizzazione precedente). Utilizzare uno di questi:

[[self navigationController] popViewControllerAnimated:YES]; // goes back to previous view 
[[self navigationController] popToViewController: myViewControllerAfterLogin animated:YES]; // goes back to specific view on stack. 
[[self navigationController] popToRootViewControllerAnimated:YES]; // goes back to first view on the stack 

La transizione animato dovrebbe invertire il tipo di transizione usato sulla segue, in modo da rannicchiarsi verrà arricciata verso il basso quando si elimina la vista.

+0

Se stai usando un seguito personalizzato, ad esempio un effetto non scorrevole per un seguito push, il pop non sarà il contrario dei tuoi passi personalizzati, ma piuttosto solo un effetto diapositiva. – nenchev

2

malhal è giusto - vale la pena di clic sul suo collegamento.

Il codice sembra essersi spostato un po 'dall'esempio di Apple ed è ancora più flessibile. Ho tre scene ma solo un file .m ViewController personalizzato. Non volevo uno stack di navigazione. L'accesso alle scene successive avviene tramite sequenze dai pulsanti. Ho aggiunto questa riga nel file controllore .m vista di base:

- (IBAction)unwindForSegue:(UIStoryboardSegue *)unwindSegue towardsViewController:(UIViewController *)subsequentVC{} 

Poi nella terza scena che controllo-trascinato da un pulsante all'icona uscita e selezionato l'azione di svolgimento. Ora torna dalla scena 3 alla scena 2 senza dover chiamare un metodo di controllo del controllo di chiusura.

+0

Penso che la cosa fondamentale che ho finalmente capito è che scaricherà il tuo stack fino a che non arriva a un controller che implementa la unwindAction associata allo specifico exit che stai usando. In questo modo è possibile definire più segui di uscita con diverse azioni di svolgimento, quindi implementare l'azione di svolgimento specifica nel controller in cui si desidera eseguire l'atterraggio, per ciascuno dei segui. –

Problemi correlati