viewDidLoad ist die erste Methode, die UIKit nach dem Laden der View von UIViewController in den Speicher aufruft. Laut Apple Developer Documentation wird diese Methode genau einmal während der gesamten Lebensdauer des Controllers aufgerufen. viewDidLoad ist der primäre Ort für die initiale Einrichtung der Benutzeroberfläche, das Registrieren von Zellen und die Dateninitialisierung.
Wichtigste Punkte
viewDidLoad ist eine Instanzmethode von UIViewController, die UIKit sofort aufruft, nachdem die View des Controllers in den Speicher geladen wurde. Zu diesem Zeitpunkt sind alle IBOutlet-Eigenschaften bereits mit den Schnittstellenelementen verbunden, aber die View wurde noch nicht zur Fensterhierarchie hinzugefügt und ist für den Benutzer nicht sichtbar. Der Entwickler überschreibt diese Methode, um die anfängliche Bildschirmkonfiguration durchzuführen.
Die Methode ist Teil des ViewController Lifecycle und folgt unmittelbar auf loadView, wenn die View programmgesteuert erstellt wird, oder nach dem Laden aus dem Storyboard. In einem typischen Projekt ist viewDidLoad die am häufigsten überschriebene Methode von UIViewController, da sie einen sicheren Punkt für die Arbeit mit Subviews bietet, die bereits existieren und zur Konfiguration bereit sind.
Ein wichtiges Detail: Zum Zeitpunkt des Aufrufs von viewDidLoad entsprechen die Abmessungen der View noch nicht den endgültigen — Auto Layout hat seine Durchläufe noch nicht abgeschlossen, und der Frame kann von den Erwartungen abweichen. Für Berechnungen, die von Abmessungen abhängen, verwenden Sie viewDidLayoutSubviews.
Der Zeitpunkt des viewDidLoad-Aufrufs hängt davon ab, wie der Controller initialisiert wird. In den meisten Fällen ruft UIKit diese Methode automatisch auf, wenn zum ersten Mal auf die view-Eigenschaft des Controllers zugegriffen wird — dies wird als Lazy-Loading-Mechanismus von UIViewController bezeichnet.
Wenn ein NavigationController oder TabBarController Ihren Bildschirm zum ersten Mal anzeigt, überprüft UIKit, ob die View geladen ist. Wenn nicht — wird loadView aufgerufen (oder Laden aus dem Storyboard), wonach sofort viewDidLoad ausgelöst wird. Dies ist das Standardszenario und tritt einmal für jede Controller-Instanz auf.
override func viewDidLoad() {
super.viewDidLoad()
print("View geladen — Sie können die Oberfläche konfigurieren")
setupUI()
configureTableView()
}
viewDidLoad wird nicht erneut aufgerufen bei Rückkehr zum Bildschirm über den Zurück-Button oder Dismiss. Wenn Ihre Logik davon abhängt, dass der Bildschirm erneut angezeigt wird — platzieren Sie sie in viewWillAppear. Dies ist einer der häufigsten konzeptionellen Fehler: Entwickler erwarten, dass viewDidLoad bei jeder Anzeige ausgelöst wird, aber UIKit ruft es nur einmal auf.
Manchmal greifen Entwickler zwangsweise auf die view des Controllers zu, um das Laden vorzeitig auszulösen: let _ = controller.view. Dies erzwingt den Aufruf von loadView und viewDidLoad, bevor der Controller auf dem Bildschirm erscheint. Diese Technik wird verwendet, wenn Sie die View im Voraus für einen reibungslosen Übergang vorbereiten müssen.
viewDidLoad ist für einmalige Einrichtungsvorgänge gedacht, die nicht davon abhängen, ob der Bildschirm sichtbar ist. Die korrekte Verwendung dieser Methode ist der Schlüssel zu einer sauberen Architektur und einem vorhersagbaren Controller-Verhalten.
In viewDidLoad registrieren Sie Nib-Dateien und Klassen für UITableView und UICollectionView, konfigurieren Delegaten und legen Anfangswerte für Eigenschaften von UI-Elementen fest. Da zu diesem Zeitpunkt alle IBOutlet bereits verbunden sind, können Sie sicher auf label.text, imageView.image und andere Subview-Eigenschaften zugreifen.
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
tableView.delegate = self
tableView.register(
CustomCell.self,
forCellReuseIdentifier: CustomCell.identifier
)
title = "Hauptbildschirm"
}
Hier erstellen Sie eine viewModel, initialisieren die Datenquelle mit Arrays und abonnieren Benachrichtigungen, die während der gesamten Lebensdauer des Controllers aktiv sein sollen. Beispielsweise ist das Abonnieren von UIApplication.willEnterForegroundNotification zum Aktualisieren von Daten bei der Rückkehr aus dem Hintergrund ein guter Kandidat für viewDidLoad. Die viewModel fungiert in der modernen iOS-Architektur als Brücke zwischen dem Controller und der Geschäftslogik, und ihre Initialisierung in viewDidLoad stellt sicher, dass die Daten bereit sind, wenn der Bildschirm zum ersten Mal erscheint.
Achten Sie besonders auf die Konfiguration der Datenquelle für Tabellen und Sammlungen. Wenn Ihre Tabelle UIFetchedResultsController oder NSFetchedResultsController mit Core Data verwendet, initialisieren Sie den Fetch-Request und den Delegaten in viewDidLoad. Dadurch wird sichergestellt, dass die Tabelle beim ersten Erscheinen des Bildschirms bereits ohne zusätzliche Anfragen mit Daten gefüllt ist.
In viewDidLoad konfigurieren Sie die NavigationBar-Schaltflächen, richten den large title ein, fügen den Search-Controller hinzu und legen die Edit/Done-Schaltflächen fest. Diese Elemente ändern sich selten, wenn der Bildschirm erneut angezeigt wird, daher ist ihre Initialisierung hier optimal.
Nicht alle Operationen sind in viewDidLoad angemessen. Einige in diese Methode gesetzte Aktionen führen zu übermäßigem Speicherverbrauch, falschem Verhalten oder Fehlern, wenn der Bildschirm erneut angezeigt wird.
Vermeiden Sie das Starten von Netzwerkanfragen, deren Ergebnis nur die UI betrifft. Wenn die Anfrage vor dem Erscheinen des Bildschirms abgeschlossen wird, sieht der Benutzer das Ergebnis nicht, und wenn sie danach abgeschlossen wird — können die Daten veraltet sein. Starten Sie das Laden in viewDidLoad, aktualisieren Sie die UI jedoch in viewWillAppear.
Führen Sie in viewDidLoad keine Operationen durch, die von der Größe und Position der View abhängen. Zum Zeitpunkt des Aufrufs hat Auto Layout seine Durchläufe noch nicht abgeschlossen, und der Frame ist möglicherweise nicht endgültig. Verwenden Sie für Berechnungen viewDidLayoutSubviews oder überschreiben Sie updateViewConstraints.
Abonnieren Sie nicht Benachrichtigungen, die nur relevant sind, wenn der Bildschirm sichtbar ist. Tastaturbenachrichtigungen, Benachrichtigungen über Inhaltsänderungen von Kind-Controllern — abonnieren Sie sie in viewWillAppear und kündigen Sie sie in viewDidDisappear, um unnötige Aufrufe und Speicherlecks zu vermeiden.
Rufen Sie nicht Methoden auf, die einen sichtbaren Bildschirm erfordern. Der Versuch, einen UIAlertController von viewDidLoad aus anzuzeigen, führt zu einem Fehler, da die View des Controllers noch nicht zur Fensterhierarchie hinzugefügt wurde. Alle UI-Operationen, die vom Fenster oder presentedViewController abhängen, sollten erst ausgeführt werden, nachdem der Bildschirm erscheint.
Initialisieren Sie nicht unnötigerweise schwere Ressourcen. Wenn der Bildschirm selten angezeigt wird oder Daten nicht sofort dargestellt werden, verschieben Sie die Erstellung ressourcenintensiver Objekte, bis sie tatsächlich benötigt werden. Die Lazy-Initialisierung von Eigenschaften in Swift ist ein eingebauter Mechanismus zur Lösung dieses Problems: Eine Eigenschaft mit dem lazy-Modifikator wird nur beim ersten Zugriff erstellt, was Speicher spart und das Laden des Bildschirms beschleunigt.
Verwenden Sie nicht viewDidLoad für Operationen, die jedes Mal ausgeführt werden sollten, wenn der Bildschirm erscheint. Dies ist der grundlegendste Fehler: Anfänger platzieren häufig die Datenaktualisierungslogik in viewDidLoad und sind überrascht, dass die Tabelle bei der Rückkehr von einem anderen Bildschirm nicht neu geladen wird. Wenn eine Operation bei jeder Anzeige wiederholt werden soll — verwenden Sie viewWillAppear. Wenn sie einmal pro Lebensdauer ausgeführt werden soll — verwenden Sie viewDidLoad. Merken Sie sich diese einfache Regel, um die meisten Probleme mit dem Lebenszyklus von UIViewController zu vermeiden.
Schauen wir uns drei praktische Beispiele an, die die korrekte Verwendung von viewDidLoad in realen Projekten demonstrieren. Jedes Beispiel löst eine spezifische Bildschirmkonfigurationsaufgabe.
override func viewDidLoad() {
super.viewDidLoad()
collectionView.register(
PhotoCell.self,
forCellWithReuseIdentifier: PhotoCell.reuseId
)
collectionView.register(
HeaderView.self,
forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader,
withReuseIdentifier: HeaderView.reuseId
)
viewModel.delegate = self
viewModel.fetchInitialPage()
}
override func viewDidLoad() {
super.viewDidLoad()
let label = UILabel()
label.text = "Hallo, Welt!"
label.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(label)
NSLayoutConstraint.activate([
label.centerXAnchor.constraint(equalTo: view.centerXAnchor),
label.centerYAnchor.constraint(equalTo: view.centerYAnchor)
])
}
In viewDidLoad konfigurieren Sie auch Elemente, die angezeigt werden, wenn keine Daten vorhanden sind: leerer Zustand, Ladeanzeige, Platzhalter. Diese Komponenten werden einmal erstellt und bei jedem Erscheinen des Bildschirms wiederverwendet. Das Aus- oder Einblenden dieser Elemente wird in viewWillAppear je nach aktuellen Daten gesteuert.
override func viewDidLoad() {
super.viewDidLoad()
emptyStateLabel = UILabel()
emptyStateLabel.text = "Keine Daten"
emptyStateLabel.textAlignment = .center
emptyStateLabel.isHidden = true
view.addSubview(emptyStateLabel)
activityIndicator = UIActivityIndicatorView(style: .medium)
activityIndicator.hidesWhenStopped = true
view.addSubview(activityIndicator)
}
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(
self,
selector: #selector(handleEnterForeground),
name: UIApplication.willEnterForegroundNotification,
object: nil
)
}
@objc private func handleEnterForeground() {
refreshContent()
}
Häufig gestellte Fragen
Unter normalen Umständen nein — UIKit ruft viewDidLoad einmal nach dem Laden der View in den Speicher auf. Wenn der Controller zerstört und neu erstellt wird, wird viewDidLoad für die neue Instanz ausgeführt.
Ja, unbedingt. Der Aufruf von super.viewDidLoad stellt sicher, dass UIKit die interne Einrichtung durchführt, die für den korrekten Lifecycle erforderlich ist. Rufen Sie super immer zuerst innerhalb der Methode auf.
viewDidLoad wird einmal beim Laden der View aufgerufen. viewWillAppear wird jedes Mal vor dem Erscheinen des Bildschirms aufgerufen. Ersteres ist für einmalige Einrichtung, Letzteres für die Aktualisierung von Daten und Zustand.
Schwere synchrone Operationen in viewDidLoad blockieren den Hauptthread und verzögern das Erscheinen des Bildschirms. Asynchrones Laden ist akzeptabel, aber bei der Aktualisierung der UI nach Abschluss muss berücksichtigt werden, dass der Bildschirm möglicherweise bereits ausgeblendet ist.
Sie können viewDidLoad nicht direkt aufrufen — UIKit ruft es auf. Um das Laden der View zu erzwingen, greifen Sie auf die Eigenschaft controller.view zu. Dies löst automatisch loadView und viewDidLoad aus.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch