Könnten Sie mir die richtige Art und Weise erläutern, um den Lebenszyklus von UIViewController
zu verwalten?
Insbesondere möchte ich wissen, wie die Methoden Initialize
, ViewDidLoad
, ViewWillAppear
, ViewDidAppear
, ViewWillDisappear
, ViewDidDisappear
, ViewDidUnload
und Dispose
für eine UIViewController
-Klasse verwendet werden.
Alle diese Befehle werden zu den entsprechenden Zeitpunkten automatisch von iOS aufgerufen, wenn Sie den View-Controller laden/präsentieren/ausblenden. Es ist wichtig zu beachten, dass diese Methoden an UIViewController
und nicht an UIView
s selbst angehängt sind. Sie werden keine dieser Funktionen nur mit einer UIView
erhalten.
Es gibt eine großartige Dokumentation auf der Apple-Website hier . Einfach reinlegen:
ViewDidLoad
- Wird aufgerufen, wenn Sie die Klasse erstellen und aus Xib laden. Ideal für die Erstinstallation und einmalige Arbeit.
ViewWillAppear
- Wird aufgerufen, bevor Ihre Ansicht angezeigt wird. Diese Option eignet sich zum Ausblenden/Anzeigen von Feldern oder Vorgängen, die jedes Mal ausgeführt werden sollen, bevor die Ansicht angezeigt wird. Da Sie zwischen den Ansichten hin und her wechseln können, wird dies jedes Mal aufgerufen, wenn Ihre Ansicht auf dem Bildschirm erscheint.
ViewDidAppear
- Wird aufgerufen, nachdem die Ansicht angezeigt wird - ein hervorragender Ort zum Starten einer Animation oder zum Laden externer Daten aus einer API.
ViewWillDisappear
/DidDisappear
- Gleiche Idee wie ViewWillAppear
/ViewDidAppear
.
ViewDidUnload
/ViewDidDispose
- In Objective C erledigen Sie hier das Aufräumen und Freigeben von Dingen. Dies wird jedoch automatisch erledigt, sodass Sie hier nicht viel tun müssen.
Der UIViewController-Lebenszyklus wird hier dargestellt:
http://rdkw.wordpress.com/2013/02/24/ios-uiviewcontroller-lifecycle/
Dies gilt für die neuesten iOS-Versionen (Geändert mit Xcode 9.3, Swift 4.1). Nachfolgend sind alle Phasen aufgeführt, die den Lebenszyklus eines UIViewController
vervollständigen .
loadView()
loadViewIfNeeded()
viewDidLoad()
viewWillAppear(_ animated: Bool)
viewWillLayoutSubviews()
viewDidLayoutSubviews()
viewDidAppear(_ animated: Bool)
viewWillDisappear(_ animated: Bool)
viewDidDisappear(_ animated: Bool)
Lassen Sie mich all diese Phasen erklären.
1. loadView
Dieses Ereignis erstellt die Ansicht, die der Controller verwaltet. Es wird nur aufgerufen, wenn der Ansichtscontroller programmgesteuert erstellt wird. Dies macht es zu einem guten Ort, um Ihre Ansichten in Code zu erstellen.
Hier sollten Unterklassen ihre benutzerdefinierte Ansichtshierarchie erstellen, wenn sie keine Schreibfeder verwenden. Sollte niemals direkt angerufen werden.
2. loadViewIfNeeded
Wenn die Ansicht des aktuellen viewController
noch nicht festgelegt wurde, lädt diese Methode die Ansicht. Beachten Sie jedoch, dass dies nur in iOS> = 9.0 verfügbar ist. Wenn Sie also iOS <9.0 unterstützen, sollten Sie nicht damit rechnen, dass es ins Bild kommt.
Lädt die Ansicht des View Controllers, falls diese noch nicht festgelegt wurde.
. viewDidLoad
Das Ereignis viewDidLoad
wird nur aufgerufen, wenn die Ansicht erstellt und in den Speicher geladen wurde, die Grenzen für die Ansicht jedoch noch nicht definiert sind. Dies ist ein guter Ort, um die Objekte zu initialisieren, die der Ansichts-Controller verwenden wird.
Wird aufgerufen, nachdem die Ansicht geladen wurde. Für View-Controller, die im Code erstellt wurden, ist dies nach -loadView. Bei View-Controllern, die von einer Nib entfernt wurden, erfolgt dies, nachdem die View festgelegt wurde.
4. viewWillAppear
Dieses Ereignis benachrichtigt das viewController
, sobald die Ansicht auf dem Bildschirm angezeigt wird. In diesem Schritt hat die Ansicht definierte Grenzen, aber die Ausrichtung ist nicht festgelegt.
Wird aufgerufen, wenn die Ansicht gerade sichtbar gemacht wird. Default macht nichts.
5. viewWillLayoutSubviews
Dies ist der erste Schritt im Lebenszyklus, in dem die Grenzen festgelegt werden. Wenn Sie keine Einschränkungen oder kein automatisches Layout verwenden, möchten Sie die Unteransichten wahrscheinlich hier aktualisieren. Dies ist nur in iOS> = 5.0 verfügbar. Wenn Sie also iOS <5.0 unterstützen, sollten Sie nicht damit rechnen, dass es ins Bild kommt.
Wird aufgerufen, kurz bevor die layoutSubviews-Methode des View-Controllers aufgerufen wird. Unterklassen können nach Bedarf implementiert werden. Der Standardwert ist nop.
6. viewDidLayoutSubviews
Dieses Ereignis benachrichtigt den Ansichtscontroller, dass die Unteransichten eingerichtet wurden. Es ist ein guter Ort, um Änderungen an den Unteransichten vorzunehmen, nachdem sie festgelegt wurden. Dies ist nur in iOS> = 5.0 verfügbar. Wenn Sie also iOS <5.0 unterstützen, sollten Sie nicht damit rechnen, dass es ins Bild kommt.
Wird aufgerufen, unmittelbar nachdem die layoutSubviews-Methode des View-Controllers aufgerufen wurde. Unterklassen können nach Bedarf implementiert werden. Der Standardwert ist nop.
7. viewDidAppear
Das Ereignis viewDidAppear
wird ausgelöst, nachdem die Ansicht auf dem Bildschirm angezeigt wurde. Das macht es zu einem guten Ort, um Daten von einem Backend-Service oder einer Datenbank abzurufen.
Wird aufgerufen, wenn die Ansicht vollständig auf den Bildschirm übergegangen ist. Default macht nichts
8. viewWillDisappear
Das viewWillDisappear
-Ereignis wird ausgelöst, wenn die Ansicht des angezeigten viewController
im Begriff ist, zu verschwinden, zu schließen, zu verbergen oder sich hinter anderen viewController
zu verstecken. Dies ist ein guter Ort, an dem Sie Ihre Netzwerkanrufe einschränken, den Timer ungültig machen oder Objekte freigeben können, die an dieses viewController
gebunden sind.
Wird aufgerufen, wenn die Ansicht geschlossen, verdeckt oder auf andere Weise ausgeblendet wird.
9. viewDidDisappear
Dies ist der letzte Schritt des Lebenszyklus, auf den jeder eingehen kann, wenn dieses Ereignis ausgelöst wird, nachdem die Ansicht von "presented viewController
" verschwunden, verworfen, verdeckt oder verborgen wurde.
Wird aufgerufen, nachdem die Ansicht verworfen, verdeckt oder auf andere Weise verborgen wurde. Default macht nichts
Nun, wie in Apple beschrieben, sollten Sie bei der Implementierung dieser Methode daran denken, die super
-Implementierung dieser bestimmten Methode aufzurufen.
Wenn Sie eine Unterklasse von UIViewController bilden, müssen Sie die Super-Implementierung dieser Methode aufrufen, auch wenn Sie keine NIB verwenden. (Zur Vereinfachung erledigt dies die standardmäßige init-Methode für Sie und gibt für beide Argumente dieser Methode nil an.) In der angegebenen NIB sollte für den Eigentümer-Proxy der Datei die Klasse auf Ihre View-Controller-Unterklasse mit dem View-Ausgang festgelegt sein verbunden mit der Hauptansicht. Wenn Sie diese Methode mit einem Null-NIB-Namen aufrufen, versucht die Methode dieser Klasse '
-loadView
, Eine NIB zu laden, deren Name mit der Klasse Ihres View-Controllers identisch ist. Wenn keine solche NIB vorhanden ist, müssen Sie entweder-setView:
Aufrufen, bevor-view
Aufgerufen wird, oder die Methode-loadView
Überschreiben, um Ihre Ansichten programmgesteuert einzurichten.
Hoffe das hat geholfen. Vielen Dank.
UPDATE - Wie @ThomasW im Kommentar gezeigt hat, werden viewWillLayoutSubviews
und viewDidLayoutSubviews
auch zu anderen Zeiten aufgerufen, wenn Unteransichten des Hauptfensters angezeigt werden Ansicht werden geladen, wenn beispielsweise Zellen einer Tabellenansicht oder einer Sammlungsansicht geladen werden.
iOS 10,11 (Swift 3.1, Swift 4.0)
Laut UIViewController
in UIKit
Entwicklern,
1. loadView ()
Hier sollten Unterklassen ihre benutzerdefinierte Ansichtshierarchie erstellen, wenn sie kein nib verwenden. Sollte niemals direkt angerufen werden.
2. loadViewIfNeeded ()
Lädt die Ansicht des View Controllers, falls diese noch nicht festgelegt wurde.
3. viewDidLoad ()
Wird aufgerufen, nachdem die Ansicht geladen wurde. Für View-Controller, die im Code erstellt wurden, ist dies nach -loadView. Bei View-Controllern, die von einer Nib entfernt wurden, erfolgt dies, nachdem die View festgelegt wurde.
4. viewWillAppear (_ animated: Bool)
Wird aufgerufen, wenn die Ansicht gerade sichtbar gemacht wird. Default macht nichts
5. viewWillLayoutSubviews ()
Wird aufgerufen, kurz bevor die layoutSubviews-Methode des View-Controllers aufgerufen wird. Unterklassen können nach Bedarf implementiert werden. Default macht nichts.
6. viewDidLayoutSubviews ()
Wird aufgerufen, unmittelbar nachdem die layoutSubviews-Methode des View-Controllers aufgerufen wurde. Unterklassen können nach Bedarf implementiert werden. Default macht nichts.
7. viewDidAppear (_ animated: Bool)
Wird aufgerufen, wenn die Ansicht vollständig auf den Bildschirm übergegangen ist. Default macht nichts
8. viewWillDisappear (_ animated: Bool)
Wird aufgerufen, wenn die Ansicht geschlossen, verdeckt oder auf andere Weise ausgeblendet wird. Default macht nichts
9. viewDidDisappear (_ animated: Bool )
Wird aufgerufen, nachdem die Ansicht verworfen, verdeckt oder auf andere Weise verborgen wurde. Default macht nichts
10. viewWillTransition (auf Größe: CGSize, mit Koordinator: UIViewControllerTransitionCoordinator)
Wird aufgerufen, wenn die Ansicht übergeht.
11. willMove (toParentViewController parent: UIViewController?)
12. didMove (toParentViewController parent: UIViewController?)
Diese beiden Methoden sind öffentlich, damit Container-Unterklassen beim Übergang zwischen untergeordneten Controllern aufgerufen werden können. Wenn sie überschrieben werden, sollten die Überschreibungen sicherstellen, dass der Super aufgerufen wird.
Das übergeordnete Argument in beiden Methoden ist null, wenn ein untergeordnetes Element aus dem übergeordneten Element entfernt wird. Andernfalls entspricht es dem neuen übergeordneten Ansichtscontroller.
13. didReceiveMemoryWarning ()
Wird aufgerufen, wenn die übergeordnete Anwendung eine Speicherwarnung empfängt. Unter iOS 6.0 wird die Ansicht nicht mehr standardmäßig gelöscht.
Ab iOS 6 und höher. Das neue Diagramm sieht wie folgt aus:
Die Methoden viewWillLayoutSubviews
und viewDidLayoutSubviews
werden in den Diagrammen nicht erwähnt, jedoch zwischen viewWillAppear
und viewDidAppear
aufgerufen. Sie können mehrfach aufgerufen werden.
Konzentrieren wir uns auf Methoden, die für den IViewController's Lebenszyklus verantwortlich sind:
Erstellung:
- (void)init
- (void)initWithNibName:
Erstellung der Ansicht:
- (BOOL)isViewLoaded
- (void)loadView
- (void)viewDidLoad
- (UIView *)initWithFrame:(CGRect)frame
- (UIView *)initWithCoder:(NSCoder *)coder
Behandlung der Änderung des Ansichtsstatus:
- (void)viewDidLoad
- (void)viewWillAppear:(BOOL)animated
- (void)viewDidAppear:(BOOL)animated
- (void)viewWillDisappear:(BOOL)animated
- (void)viewDidDisappear:(BOOL)animated
- (void)viewDidUnload
Umgang mit Speicherwarnungen:
- (void)didReceiveMemoryWarning
Freigabe
- (void)viewDidUnload
- (void)dealloc
Weitere Informationen finden Sie unter IViewController-Klassenreferenz .
Hier gibt es viele veraltete und unvollständige Informationen. Für iOS 6 und neuer nur:
loadView
[ein]viewDidLoad
[ein]viewWillAppear
viewWillLayoutSubviews
ist der erste Zeitpunkt, an dem Grenzen festgelegt werdenviewDidLayoutSubviews
viewDidAppear
*
viewWillLayoutSubviews
[b]*
viewDidLayoutSubviews
[b]Fußnoten:
(a) - Wenn Sie Ihre Ansicht während didReceiveMemoryWarning
manuell auf Null setzen, werden loadView
und viewDidLoad
erneut aufgerufen. Das heißt, standardmäßig werden loadView
und viewDidLoad
nur einmal pro View-Controller-Instanz aufgerufen.
(b) Kann ein zusätzliches 0 oder mehrmals aufgerufen werden
Die Antwort von Haider ist für iOS 6 richtig. Allerdings werden viewDidUnload und viewWillUnload ab iOS 6 nie aufgerufen. Der docs state: "Ansichten werden nicht mehr unter Bedingungen mit wenig Arbeitsspeicher gelöscht und daher wird diese Methode nie aufgerufen."
Zustandsübergänge im offiziellen Dokument erklären: https://developer.Apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/index.html
Dieses Bild zeigt die gültigen Zustandsübergänge zwischen verschiedenen "Will" - und "Did" -Rückrufmethoden
Gültige Zustandsübergänge:
Entnommen aus: https://developer.Apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Art/UIViewController Klasse Reference_2x.png
viewDidLoad()
— Wird aufgerufen, wenn die Inhaltsansicht des View-Controllers (der oberste Teil der Ansichtshierarchie) erstellt und aus einem Storyboard geladen wird . … Verwenden Sie diese Methode, um zusätzliche Einstellungen vorzunehmen, die für Ihren View Controller erforderlich sind.
viewWillAppear()
— Wird aufgerufen, bevor die Inhaltsansicht des View-Controllers der Ansichtshierarchie der App hinzugefügt wird. Verwenden Sie diese Methode, um alle Vorgänge auszulösen, die ausgeführt werden müssen, bevor die Inhaltsansicht auf dem Bildschirm angezeigt wird
viewDidAppear()
— Wird aufgerufen, nachdem die Inhaltsansicht des View-Controllers der Ansichtshierarchie der App hinzugefügt wurde. Verwenden Sie diese Methode, um alle erforderlichen Vorgänge auszulösen, sobald die Ansicht auf dem Bildschirm angezeigt wird, z. B. das Abrufen von Daten oder das Anzeigen einer Animation.
viewWillDisappear()
— Wird aufgerufen, bevor die Inhaltsansicht des View Controller aus der Ansichtshierarchie der App entfernt wird. Verwenden Sie diese Methode, um Bereinigungsaufgaben auszuführen, z. B. Änderungen zu übernehmen oder den Status des ersten Responders zu unterschreiben.
viewDidDisappear()
— Wird aufgerufen, nachdem die Inhaltsansicht des View Controller aus der Ansichtshierarchie der App entfernt wurde. Verwenden Sie diese Methode, um zusätzliche Abreißaktivitäten auszuführen.