Il ciclo di vita di un UIViewController include metodi chiave:
init(nibName:bundle:) / init(coder:): inizializzazioneloadView: creazione della gerarchia delle viewviewDidLoad: la view è caricata (il posto ideale per la configurazione iniziale)viewWillAppear / viewDidAppear: la view sta per essere mostrata / è stata mostrataviewWillDisappear / viewDidDisappear: la view sta per scomparire / è scomparsadeinit: rimozione del controllerL'ordine di chiamata dei metodi:
loadView, poi viewDidLoad)viewWillAppear / viewWillDisappear, poi viewDidAppear / viewDidDisappeardeinitSottigliezze:
viewDidLoad non è consigliabile accedere alle dimensioni delle view — potrebbero non essere aggiornatedeinit o viewWillDisappearviewDidLoad, ma non in viewWillAppear — altrimenti potrebbe verificarsi una duplicazione ad ogni apparizioneEsempio:
class MyViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() setupViews() setupBindings() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // Iscriviti alle notifiche } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) // Disiscriversi dalle notifiche } deinit { // Pulizia } }
Domanda:
È consentito al view controller accedere alle proprietà della view al di fuori del ciclo di vita (ad esempio, nel costruttore)?
Risposta:
No, prima della chiamata (o sovrascrittura) di loadView, tutte le proprietà legate alla view potrebbero non essere state inizializzate. Qualsiasi accesso a esse al di fuori di loadView / viewDidLoad porterà a un crash.
Esempio:
// Errore: self.view non è ancora stata inizializzata! init() { super.init(nibName: nil, bundle: nil) self.view.backgroundColor = .red //CRASH }
Storia
Il progetto è andato in crash a causa di un accesso prematuro a self.view in init — la view non era stata creata, portando a un crash.
Storia
Nei grandi progetti si dimenticava di disiscriversi da NotificationCenter o delegate in viewWillDisappear e/o deinit, il che portava a perdite di memoria (NotificationCenter continuava a riferirsi al view controller, che non veniva liberato e continuava a ricevere eventi).
Storia
In viewWillAppear, ad ogni apparizione venivano aggiunti nuovi subview alla view (ad esempio, mostrava un indicatore di caricamento), senza controllare l'esistenza. Di conseguenza, ad ogni ritorno sullo schermo apparivano sempre più indicatori duplicati, causando malfunzionamenti nell'interfaccia utente.