Ho dubbi che è necessario essere chiari .. Ho stack e un controller di navigazione. Ora quando lo stack carica viene chiamato viewDidLoad
viewWillAppear
viewDidAppear
. quando clicco su un pulsante, questo pulsante mi spinge verso il nuovo stack, ora il nuovo stack mi dà l'opzione del retro ... ora quando clicco sul retro del controller di navigazione ... perché solo viewWillAppear
verrà chiamato .. perché non viewDidLoad
e non viewDidAppear
perché solo viewWillAppear ha richiamato la navigazione indietro
risposta
Lo stack è Last in First Out (LIFO), quindi quando si spingono nuovi controller di visualizzazione in pila, il precedente controllore di vista non viene distrutto (e rimane in memoria). Quando si torna indietro, non è necessario ricreare Viewcontroller poiché è già in memoria. Quindi viene chiamato solo viewWillAppear
.
Per quanto riguarda il motivo per cui viewDidAppear
non viene chiamato in questo caso, non ricordo dove ho letto questo, ma viewDidAppear
viene chiamato dopo che la vista di UIViewController è stata aggiunta alla gerarchia UIWindow dell'applicazione. E questo processo viene fatto prima che UIViewController venga mostrato per la prima volta.
viewDidLoad
chiamato solo quando le viste viewControllers vengono caricate nella memoria. Sarà fatto quando
- la prima volta che è necessario al fine di essere mostrato
- volte quando viewController doveva essere ricaricato nuovamente, perché viene eliminato dalla memoria per qualche ragione memoria insufficiente.
Nel tuo caso, quando si torna indietro, viewController è già caricato, quindi non è necessario chiamare di nuovo viewDidLoad
.
yaa ok ho capito ... ma perché non 'viewDidAppear' e' viewDidLoad' – Christien
@Christien Si prega di vedere la modifica – Krishnabhadra
ok allora nel nostro caso ..'viewWillAppear' e 'ViewDidAppear' dovrebbero essere chiamati ryt ... ma' viewWillAppear' chiamato only not 'ViewDidAppear' – Christien
Non ho una risposta completa per te ma spero che questo aiuti.
viewDidLoad è un callback per la modifica di una vista dopo che si è verificato l'evento di caricamento. Nel tuo caso, la vista è già stata caricata. Il fatto che non sia in vista non significa che sia stato scaricato dalla memoria.
viewDidAppear: Anche se non so perché questo evento non stia sparando e sarebbe felice se qualcun altro riempia il vuoto.
L'intero ciclo di vita di ios ui spiega qui.
http://www.verydemo.com/demo_c134_i4568.html
Nota Per Abizern da commentare: questo è vero per iOS5 e versioni precedenti. iOS6 non scarica più le viste.
Aggiungi riferimento da dove hai ottenuto questo screenshot :) –
ya ma non ha ottenuto la logica y solo 'viewWillAppear' verrà richiamato sulla navigazione indietro ... non altro – Christien
Perché quando si esegue il backup di quel controller di visualizzazione già creato. viewDidLoad ha chiamato in fase di inizializzazione solo se non lo ha già creato. ViewWillAppear chiama ogni volta che arriva allo schermo. –
Prima di tutto, bella domanda @ user2102546. Controlla qui il motivo perfetto per la tua richiesta.
viewDidLoad viene chiamato solo se le viste del controller di visualizzazione sono state scaricate e devono essere ricaricate.
Normalmente, se si utilizza un controller di navigazione e si torna a una vista precedente con uno dei metodi pop, viewDidLoad does not get called again, because the view are not unloaded yet
.
Tuttavia, il sistema può scaricare le viste di qualsiasi controller di visualizzazione quando non è in primo piano per liberare memoria, quindi viewDidLoad può essere richiamato in qualsiasi momento in cui un controller di visualizzazione sta per essere presentato. Devi scrivere il tuo codice per rispondere correttamente ai diversi eventi.
Buona programmazione !!
se consideriamo l'immagine sopra riportata da Hasintha e la tua risposta ...' viewDidLoad non viene richiamato, perché la vista non è ancora stata scaricata. Bene il ..'viewdidload non sarà chiamato come non scaricato ma viewWillAppear e ViewDidAppear dovrebbero essere chiamati ' – Christien
@Christien, Yes, Both viewWillAppear e ViewDidAppear, verranno richiamati alla navigazione indietro. –
viewDidAppear deve essere chiamato. Prova a mettere NSLog invece se stai controllando con breakpoint –
'viewDidAppear' viene sempre chiamato nelle mie app. Assicurati che nel tuo metodo 'viewWillAppear:' che chiami '[super viewWillAppear: animated]'. Chiama il proprio '[super xxx]' anche negli altri tuoi metodi. – rmaddy