Der Lebenszyklus eines UIViewController umfasst die wichtigsten Methoden:
init(nibName:bundle:) / init(coder:): InitialisierungloadView: Erstellung der View-HierarchieviewDidLoad: View wurde geladen (idealer Ort für die Erstkonfiguration)viewWillAppear / viewDidAppear: View wird angezeigt / wurde angezeigtviewWillDisappear / viewDidDisappear: View wird ausgeblendet / wurde ausgeblendetdeinit: Entfernung des ControllersReihenfolge der Methodenaufrufe:
loadView, dann viewDidLoad)viewWillAppear / viewWillDisappear, dann viewDidAppear / viewDidDisappear aufgerufendeinitFeinheiten:
viewDidLoad sollte nicht auf die Größen der View zugegriffen werden — diese könnten nicht aktuell seindeinit oder viewWillDisappear freizugebenviewDidLoad hinzugefügt werden, aber nicht in viewWillAppear — sonst kann es bei jedem Auftauchen zu Duplikationen kommenBeispiel:
class MyViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() setupViews() setupBindings() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // Für Benachrichtigungen abonnieren } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) // Von Benachrichtigungen abmelden } deinit { // Aufräumen } }
Frage:
Darf der ViewController außerhalb des Lebenszyklus auf Eigenschaften der View zugreifen (zum Beispiel im Initialisierer)?
Antwort:
Nein, vor dem Aufruf (oder der Überschreibung) von loadView können alle mit der View verbundenen Eigenschaften nicht initialisiert sein. Jeder Zugriff auf sie außerhalb von loadView / viewDidLoad führt zu einem Crash.
Beispiel:
// Fehler: self.view ist noch nicht initialisiert! init() { super.init(nibName: nil, bundle: nil) self.view.backgroundColor = .red //CRASH }
Geschichte
Das Projekt stürzte ab, weil auf self.view im Init zu früh zugegriffen wurde – die View war nicht erstellt, was zu einem Crash führte.
Geschichte
In großen Projekten wurde vergessen, sich in viewWillDisappear und/oder deinit vom NotificationCenter oder Delegate abzumelden, was zu Speicherlecks führte (NotificationCenter verwies auf den ViewController, dieser wurde nicht freigegeben und hörte weiterhin Ereignisse).
Geschichte
In viewWillAppear wurden bei jedem Erscheinen neue Subviews zur View hinzugefügt (zum Beispiel wurde ein Ladeindikator angezeigt), ohne auf deren Existenz zu prüfen. Infolgedessen erschienen bei jedem Zurückkehren immer mehr duplizierte Indikatoren, die UI fiel aus.