UIViewController viewDidLoad vs. viewWillAppear: qual è la divisione del lavoro corretta?


164

Sono sempre stato un po 'poco chiaro sul tipo di attività che dovrebbero essere assegnate a viewDidLoadvs viewWillAppear.: in una UIViewControllersottoclasse.

ad esempio, sto realizzando un'app in cui ho una UIViewControllersottoclasse che colpisce un server, ottiene i dati, li inserisce in una vista e quindi visualizza quella vista. Quali sono i pro ei contro di fare questo in viewDidLoadcontro viewWillAppear?

Risposte:


251

viewDidLoad è una cosa che devi fare una volta. viewWillAppear viene chiamato ogni volta che appare la vista. Dovresti fare cose che devi fare solo una volta in viewDidLoad - come impostare i tuoi testi UILabel. Tuttavia, potresti voler modificare una parte specifica della vista ogni volta che l'utente riesce a visualizzarla, ad esempio l'applicazione iPod fa scorrere i testi in alto ogni volta che vai alla vista "Riproduzione in corso".

Tuttavia, quando carichi elementi da un server, devi anche pensare alla latenza. Se impacchetti tutte le comunicazioni di rete in viewDidLoad o viewWillAppear, verranno eseguite prima che l'utente riesca a vedere la vista, causando eventualmente un breve blocco della tua app. Potrebbe essere una buona idea mostrare all'utente una vista non popolata con un indicatore di attività di qualche tipo. Quando hai finito con la tua rete, che può richiedere un secondo o due (o potrebbe anche fallire - chi lo sa?), Puoi popolare la vista con i tuoi dati. Buoni esempi su come farlo potrebbe essere visto in vari client di Twitter. Ad esempio, quando si visualizza la pagina dei dettagli dell'autore in Twitterrific, la vista dice solo "Caricamento in corso ..." fino al completamento delle query di rete.


Pertanto, per quanto riguarda viewWillAppear viene potenzialmente chiamato ripetutamente. Questo metodo verrebbe attivato se, ad esempio, la vista dei controllori della vista diventasse visibile dopo essere stata nascosta (intendo qui occlusa, non il metodo nascosto su UIView). In quale scenario sarebbe chiamato WillAppear senza essere preceduto da una chiamata a viewDidLoad?
dugla,

7
viewDidLoad viene chiamato SOLO quando viene costruita la vista, ad esempio dopo una chiamata initFromNibNamed controller di vista quando si accede alla vista. viewWillAppear viene chiamato ogni volta che il controller della vista non era in vista ma viene visualizzato, quindi quando viene premuto il controller della vista, viene chiamato viewWillAppear. Se si spinge da un'altra sottoview e l'utente ritorna, viene richiamato viewWillAppear.
Kendall Helmstetter Gelner,

Grazie Kendall. Yah, alcuni NSLogs strategicamente posizionati mi hanno risolto. viewWillAppear / viewWillDissappear fire on viewcontroller push / pops.
dugla,

3
Si noti che viewDidLoad verrà anche chiamato se la vista è nascosta e quindi scaricata per motivi legati alla memoria, quindi riappare. Su cosa puoi contare: viewDidLoad verrà chiamato ALMENO UNA VOLTA quando la vista viene creata per la prima volta e POSSIBILMENTE più volte quando la vista riappare dopo essere stata nascosta. viewWillAppear verrà SEMPRE chiamato quando la vista sta per apparire sullo schermo.
DanM,

2
Qualcuno può commentare ulteriormente queste due domande correlate: (1) A volte, non sempre, i valori dei frame per i controlli (ad es. Origine e dimensione) sono zero in viewDidLoad, e talvolta no - Perché? (2) Nel modello di Apple per un dettaglioView (iPad) di splitViewController, esiste un metodo configureView: cosa dovrebbe andare lì in relazione a viewDidLoad e ViewWillAppear?
Jeff,

12

Inizialmente utilizzato solo ViewDidLoad con tableView. Durante i test con perdita di Wifi, impostando il dispositivo in modalità aereo, si è reso conto che la tabella non si aggiornava con il ritorno di Wifi. In effetti, sembra che non ci sia modo di aggiornare tableView sul dispositivo anche premendo il pulsante home con la modalità background impostata su YES in -Info.plist.

La mia soluzione:

-(void) viewWillAppear: (BOOL) animated { [self.tableView reloadData];}

10

È importante notare che l'utilizzo di viewDidLoad per il posizionamento è un po 'rischioso e dovrebbe essere evitato poiché i limiti non sono impostati. questo può causare risultati imprevisti (ho avuto una varietà di problemi ...)

Questo post descrive abbastanza bene i diversi metodi e cosa succede in ciascuno di essi.

al momento, per una volta init e posizionamento, sto pensando di usare viewDidAppear con una bandiera, se qualcuno ha qualche altro consiglio, per favore fatemelo sapere.


d'accordo con questo: "... dovrebbe essere evitato poiché i limiti non sono impostati ..."
danisupr4

4

Dipende, hai bisogno di caricare i dati ogni volta che apri la vista? o solo una volta ?

inserisci qui la descrizione dell'immagine

  • Rosso: non devono cambiare ogni volta. Una volta caricati, rimangono come erano.
  • Viola: devono cambiare nel tempo o dopo il caricamento ogni volta. Non vuoi vedere gli stessi 3 utenti suggeriti da seguire, deve essere ricaricato ogni volta che torni allo schermo. Le loro foto potrebbero essere aggiornate ... non vuoi vedere una foto di 5 anni fa ...

viewDidLoad:Qualunque elaborazione tu abbia, deve essere eseguita una volta.
viewWilLAppear:Qualunque sia l'elaborazione che deve cambiare ogni volta che la pagina viene caricata.

Le etichette, le icone, i titoli dei pulsanti o la maggior parte dei dati InputedByDeveloper di solito non cambiano. Nomi, foto, collegamenti, stato dei pulsanti, elenchi (array di input per le visualizzazioni della tabella o della raccolta) o la maggior parte dei datiInputedByUser in genere cambiano.


Il viola verrebbe chiamato nella vista DidAppear not the viewWillAppear
Alex Kornhauser

@AlexKornhauser come vuoi dire che sarebbe chiamato? Sto dicendo viewWillAppearche puoi interrogare e controllare i tweet di latest. viewDidAppearè troppo tardi per questo
Honey
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.