wake-up-neo.com

Sie möchten den Lebenszyklus von iOS UIViewController verstehen

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.

249
Lorenzo B

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 UIViews 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.

372
Jacob Knobel

Der UIViewController-Lebenszyklus wird hier dargestellt: 

http://rdkw.wordpress.com/2013/02/24/ios-uiviewcontroller-lifecycle/

A view controller's lifecycle, diagrammed

388
Haider

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.

151
onCompletion

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.

40
Rajamohan S

Ab iOS 6 und höher. Das neue Diagramm sieht wie folgt aus:

enter image description here

28
Saad

Die Methoden viewWillLayoutSubviews und viewDidLayoutSubviews werden in den Diagrammen nicht erwähnt, jedoch zwischen viewWillAppear und viewDidAppear aufgerufen. Sie können mehrfach aufgerufen werden.

18
gjgjgj

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

UIViewController's lifecycle diagram

Weitere Informationen finden Sie unter IViewController-Klassenreferenz .

18
Alexey Pelekh

Hier gibt es viele veraltete und unvollständige Informationen. Für iOS 6 und neuer nur:

  1. loadView[ein]
  2. viewDidLoad[ein]
  3. viewWillAppear
  4. viewWillLayoutSubviews ist der erste Zeitpunkt, an dem Grenzen festgelegt werden
  5. viewDidLayoutSubviews
  6. viewDidAppear
  7. *viewWillLayoutSubviews[b]
  8. *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

16
bobics

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."

16
Matt Becker

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

9
Luismi

Laut Apples Dokument - Beginnen Sie mit der Entwicklung von iOS-Apps (Swift) - Mit View-Controllern arbeiten - Den View-Controller-Lebenszyklus verstehen

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. 

0
freddieoh