2015-07-22 21 views
6

Sto cercando di capire un comportamento di navigazione tra ViewControllers con (e senza) utilizzando un NavigationController e sto fraintendendo alcune cose mentre leggevo articoli e documenti quindi ho deciso di chiedere loro.ios - Navigazione tra più NavigationControllers

La domanda principale è: Che cosa è successo se abbiamo più Controlli di navigazione nello Storyboard e vogliamo passare da uno all'altro? (E questo può essere realizzato usando solo segues come facciamo tra VC comuni, ho ragione?)

quanto ho capito, un navigationController rappresenta una pila di ViewControllers entro il quale siamo in grado di pop e spingere questi VCs. Così ora cambiamo la nostra "posizione" da VC del primo NavigationController a VC dal secondo, cosa succede dopo? Il primo stack è scomparso e ora lavoriamo solo all'interno del secondo? In tal caso, significa che lo stack VC del primo NavigationController è stato cancellato dalla memoria o no?

Forse ho completamente frainteso qualcosa o forse no :). Sarò felice di vedere le tue risposte e spero di farti domande più dettagliate sui meccanismi di navigazione.

UPDATE

Il punto è che: Diciamo che abbiamo una (iniziale) VC con due pulsanti che rappresentano due parti separate del app. Quindi clicchiamo sul primo pulsante e passiamo a RootVC di un NC di quando torniamo al nostro VC iniziale premiamo il secondo pulsante e passiamo all'altro NC. Cosa è successo con lo stack del primo NC quando torniamo al VC iniziale e qual è il modo migliore per andare "fuori" dal NC al VC iniziale?

UPDATE

Sto cercando di capire cosa succede con la memoria e quali VC sono in scena al momento e così via. Forse è assolutamente irrilevante se abbiamo alcuni VC aggiuntivi nella scena, forse abbiamo bisogno di loro per rendere più rapido il passaggio tra NC (o solo VC). Quindi voglio solo capire come funziona davvero.

risposta

4

Immagina di avere una catena di applicazioni standard in cui spinga/apri viste nel controller di navigazione iniziale. Poi, immaginate di avere visione diversa che non fa parte di quella catena, come un profilo utente, che si presentano vista come modale:

enter image description here

Ora il controller di navigazione superiore è prima in modo da iniziare da qui, mentre al fine di utilizzare secondo, si dovrà accedere attraverso UIStoryboard come questo (freccia rossa):

// Get storyboard 
let storyboard = UIStoryboard(name: name, bundle: NSBundle.mainBundle()) 

// Get profile NC 
let profileNC = storyboard.instantiateViewControllerWithIdentifier("LoginNC") as! UINavigationController 

Ma se si vuole veramente per presentare il profilo da una parte delle app in modo che non è modale, è può farlo anche (freccia verde).L'unica differenza è che ora non hai bisogno di un secondo controller di navigazione - quindi non connetti push follow a red NC, ma accedi direttamente al controller di visualizzazione. Se si tenta effettivamente di connettere NC - NC e quindi eseguirlo, si otterrà un'eccezione di runtime che dice che hai sbagliato.

memoria

Tutto il soggiorno VC in memoria, non importa come li presenti. Ciò vale anche per le visualizzazioni di sfondo quando si presenta qualcosa come modale. Se avete problemi con la memoria a causa di lunghe catene, è possibile implementare la logica/caching pulizia nel vostro controller:

func viewWillAppear(animated: Bool) { 

    // Call super first 
    super.viewWillAppear(animated) 

    // Prepare UI 
} 

func viewWillDisappear(animated: Bool) { 

    // Call super first 
    super.viewWillAppear(animated) 

    // do some memory cleanup, since view will not be visible atm 
} 

Speranza che aiuta!

+0

Grazie per la risposta dettagliata ora ha senso per me! Come ho capito da [_La sola differenza è che ora non hai bisogno di un secondo controller di navigazione - quindi non connetti push follow a red NC_] e [_Tutti i VC restano in memoria, indipendentemente da come li presenti.] non è necessario avere più NC nell'app, creiamo solo un NC e facciamo tutte le cose al suo interno, no? Puoi fare un esempio quando abbiamo bisogno di più NC nell'app? – Max

+0

Sì, se si stanno solo premendo e scoppiando i VC, un controller di navigazione è sufficiente. Immagino che il miglior esempio di utilizzo per più controller di navigazione sia quando hai lasciato il menu nell'app che cambia la tua vista di root (quindi vai in qualche elenco, ma anche nel modulo di contatto ecc. Quindi hai più punti iniziali da cui l'utente interagisce - e avresti anche la stessa quantità di NC :) –

+0

In uno dei miei commenti a @Glorfindel ho detto di un VC (iniziale) con due pulsanti che vanno alle diverse parti dell'app (una sorta di pannello di sinistra; D). In questo caso, dopo aver passato da Initial VC a quello di NC, facciamo l'ultimo come root view, vero? E cosa succede con altri (ad esempio quando passiamo da un NC all'altro)? E anche come passare da VC di un NC a un particolare VC in un altro NC nel modo giusto? (semplicemente usando show segue?) – Max

0

Ciò che ha senso, è presentare un nuovo UINavigationController con i suoi controller di visualizzazione figlio da uno esistente come una finestra di dialogo modale (questo può essere fatto con un passaggio modale). Ogni controller di navigazione ha il proprio stack e, mentre sei occupato nella finestra di dialogo, lo stack "master" rimane intatto. Quando si chiude la finestra di dialogo, si ritorna al "master".

Non sono sicuro se sia tecnicamente possibile spingere un controller di navigazione su uno esistente. Non ha senso, però.

+0

Come ho capito, aggiunge uno NavigationController nella pila dell'altro? Non ho bisogno di un simile comportamento (e non posso davvero immaginare dove possa essere usato). Il punto è che: diciamo che abbiamo un VC (iniziale) con pulsanti che rappresentano due parti separate dell'app. Quindi clicchiamo sul primo pulsante e passiamo a RootVC di un NC di quando torniamo al nostro VC iniziale premiamo il secondo pulsante e passiamo all'altro NC. Cosa è successo con lo stack del primo NC quando torniamo al VC iniziale e qual è il modo migliore per andare "fuori" dal NC al VC iniziale? – Max

+0

Ho aggiornato la domanda con questo commento – Max

+0

Il comportamento desiderato mi ricorda UITabBarController, che gestisce diversi controller di visualizzazione figlio (che possono essere controller di navigazione). In tal caso, il controller della barra delle schede mantiene lo stato di ciascun controller di navigazione. – Glorfindel