Können Sie mir die richtige Art und Weise erklären, den UIViewController
Lebenszyklus zu verwalten ?
Insbesondere würde ich gerne wissen , wie zu verwenden Initialize
, ViewDidLoad
, ViewWillAppear
, ViewDidAppear
, ViewWillDisappear
, ViewDidDisappear
, ViewDidUnload
und Dispose
Methoden in Mono - Touch für eine UIViewController
Klasse.
ios
uiviewcontroller
xamarin.ios
lifecycle
Lorenzo B.
quelle
quelle
Antworten:
Alle diese Befehle werden von iOS zu den entsprechenden Zeiten automatisch aufgerufen, wenn Sie den View Controller laden / präsentieren / ausblenden. Es ist wichtig zu beachten, dass diese Methoden an sich selbst
UIViewController
und nicht an sichUIView
selbst gebunden sind . Sie erhalten keine dieser Funktionen nur mit aUIView
.Auf Apples Website finden Sie hier eine großartige Dokumentation . Einfach einfügen:
ViewDidLoad
- Wird aufgerufen, wenn Sie die Klasse erstellen und aus xib laden. Ideal für die Ersteinrichtung und einmalige Arbeit.ViewWillAppear
- Wird direkt vor dem Anzeigen Ihrer Ansicht aufgerufen. Sie eignet sich zum Ausblenden / Anzeigen von Feldern oder für Vorgänge, die jedes Mal ausgeführt werden sollen, bevor die Ansicht sichtbar ist. Da Sie möglicherweise zwischen den Ansichten hin und her wechseln, wird dies jedes Mal aufgerufen, wenn Ihre Ansicht auf dem Bildschirm angezeigt wird.ViewDidAppear
- Wird aufgerufen, nachdem die Ansicht angezeigt wurde - ein großartiger Ort, um Animationen zu starten oder externe Daten von einer API zu laden.ViewWillDisappear
/DidDisappear
- Gleiche Idee wieViewWillAppear
/ViewDidAppear
.ViewDidUnload
/ViewDidDispose
- In Objective-C erledigen Sie hier Ihre Bereinigung und Freigabe von Dingen, aber dies wird automatisch erledigt, so dass Sie hier nicht viel tun müssen.quelle
UPDATE: ViewDidUnload war in iOS 6 veraltet, daher wurde die Antwort entsprechend aktualisiert.
Der UIViewController-Lebenszyklus ist hier dargestellt:
Der Vorteil der Verwendung von Xamarin Native / Mono Touch besteht darin, dass die nativen APIs verwendet werden und daher derselbe ViewController-Lebenszyklus folgt, den Sie in der Apple-Dokumentation finden würden.
quelle
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
vollständigen Lebenszyklus ausmachen .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 / lädt die Ansicht, die der Controller verwaltet. Es kann aus einer zugeordneten NIB-Datei oder aus einer leeren Datei geladen werden,
UIView
wenn null gefunden wurde. Dies macht es zu einem guten Ort, um Ihre Ansichten programmgesteuert im Code zu erstellen.2.
loadViewIfNeeded
Wenn die aktuelle Ansicht
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, erwarten Sie nicht, dass es ins Bild kommt.3.
viewDidLoad
Das
viewDidLoad
Ereignis wird nur aufgerufen, wenn die Ansicht erstellt und in den Speicher geladen wird, die Grenzen für die Ansicht jedoch noch nicht definiert sind. Dies ist ein guter Ort, um die Objekte zu initialisieren, die der View Controller verwenden wird.4.
viewWillAppear
Dieses Ereignis benachrichtigt Sie,
viewController
wenn die Ansicht auf dem Bildschirm angezeigt wird. In diesem Schritt hat die Ansicht Grenzen, die definiert sind, aber die Ausrichtung ist nicht festgelegt.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 wahrscheinlich die Unteransichten hier aktualisieren. Dies ist nur in iOS> = 5.0 verfügbar. Wenn Sie also iOS <5.0 unterstützen, erwarten Sie nicht, dass es ins Bild kommt.
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, erwarten Sie nicht, dass es ins Bild kommt.
7.
viewDidAppear
Das
viewDidAppear
Ereignis wird ausgelöst, nachdem die Ansicht auf dem Bildschirm angezeigt wird. Dies macht es zu einem guten Ort, um Daten von einem Backend-Service oder einer Datenbank abzurufen.8.
viewWillDisappear
Das
viewWillDisappear
Ereignis wird ausgelöst, wenn die Ansicht des PräsentiertenviewController
verschwinden, entlassen, verdeckt oder hinter anderen versteckt werden sollviewController
. Dies ist ein guter Ort, an dem Sie Ihre Netzwerkanrufe einschränken, den Timer ungültig machen oder daran gebundene Objekte freigeben könnenviewController
.9.
viewDidDisappear
Dies ist der letzte Schritt des Lebenszyklus, den jeder ansprechen kann, wenn dieses Ereignis ausgelöst wird, nachdem die Ansicht der präsentierten
viewController
Person verschwunden, entlassen, verdeckt oder verborgen wurde.Laut Apple sollten Sie bei der Implementierung dieser Methoden daran denken, die
super
Implementierung dieser bestimmten Methode aufzurufen .Hoffe das hat geholfen. Vielen Dank.
UPDATE - Wie @ThomasW im Kommentar gezeigt hat
viewWillLayoutSubviews
undviewDidLayoutSubviews
auch zu anderen Zeiten aufgerufen wird, wenn Unteransichten der Hauptansicht geladen werden, z. B. wenn Zellen einer Tabellenansicht oder einer Sammlungsansicht geladen werden.UPDATE - Wie @Maria im Kommentar zeigte, wurde die Beschreibung von
loadView
aktualisiertquelle
viewWillLayoutSubviews
undviewDidLayoutSubviews
wird auch zu anderen Zeiten aufgerufen, wenn Unteransichten der Hauptansicht geladen werden, z. B. wenn Zellen einer Tabellenansicht oder einer Sammlungsansicht geladen werden.viewWillAppear
viewDidAppear
viewDidDisappear
. Sie müssen irgendwann super anrufen.iOS 10,11 (Swift 3.1, Swift 4.0)
Laut
UIViewController
inUIKit
Entwicklern,1. loadView ()
Hier sollten Unterklassen ihre benutzerdefinierte Ansichtshierarchie erstellen, wenn sie keine Schreibfeder 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 im Code erstellte Ansichtscontroller ist dies nach -loadView. Bei Ansichtscontrollern, die nicht von einer Schreibfeder archiviert wurden, erfolgt dies nach dem Festlegen der Ansicht.
4. viewWillAppear (_ animiert: Bool)
Wird aufgerufen, wenn die Ansicht sichtbar gemacht werden soll. Standard macht nichts
5. viewWillLayoutSubviews ()
Wird unmittelbar vor dem Aufruf der layoutSubviews-Methode des View Controllers aufgerufen. Unterklassen können nach Bedarf implementiert werden. Standard macht nichts.
6. viewDidLayoutSubviews ()
Wird direkt nach dem Aufruf der layoutSubviews-Methode des View Controllers aufgerufen. Unterklassen können nach Bedarf implementiert werden. Standard macht nichts.
7. viewDidAppear (_ animiert: Bool)
Wird aufgerufen, wenn die Ansicht vollständig auf den Bildschirm übertragen wurde. Standard macht nichts
8. viewWillDisappear (_ animiert: Bool)
Wird aufgerufen, wenn die Ansicht verworfen, verdeckt oder anderweitig ausgeblendet wird. Standard macht nichts
9. viewDidDisappear (_ animiert: Bool )
Wird aufgerufen, nachdem die Ansicht entlassen, verdeckt oder anderweitig ausgeblendet wurde. Standard macht nichts
10. viewWillTransition (auf Größe: CGSize, mit Koordinator: UIViewControllerTransitionCoordinator)
Wird aufgerufen, wenn die Ansicht "Übergang" ist.
11. willMove (toParentViewController Eltern: UIViewController?)
12. didMove (toParentViewController Eltern: 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 seinem übergeordneten Element entfernt wird. Andernfalls entspricht es dem neuen übergeordneten Ansichtscontroller.
13. didReceiveMemoryWarning ()
Wird aufgerufen, wenn die übergeordnete Anwendung eine Speicherwarnung erhält. Unter iOS 6.0 wird die Ansicht standardmäßig nicht mehr gelöscht.
quelle
nib
wie unter erwähntloadView
?viewWillLayoutSubviews()
wird aufgerufen, bevor das View-Objekt des ViewControllers seinelayoutSubviews()
Methode aufruftAb iOS 6 und höher. Das neue Diagramm sieht wie folgt aus:
quelle
Konzentrieren wir uns auf Methoden, die für den Lebenszyklus des UIViewControllers verantwortlich sind :
Schaffung:
- (void)init
- (void)initWithNibName:
Ansicht erstellen:
- (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
Behandlung von Speicherwarnungen:
- (void)didReceiveMemoryWarning
Freigabe
- (void)viewDidUnload
- (void)dealloc
Weitere Informationen finden Sie in der UIViewController-Klassenreferenz .
quelle
Die Methoden
viewWillLayoutSubviews
undviewDidLayoutSubviews
werden in den Diagrammen nicht erwähnt, aber diese werden zwischenviewWillAppear
und aufgerufenviewDidAppear
. Sie können mehrfach aufgerufen werden.quelle
Die Antwort von Haider ist für iOS 6 korrekt. Ab iOS 6 werden viewDidUnload und viewWillUnload jedoch nie mehr aufgerufen. In den Dokumenten heißt es : "Ansichten werden unter Bedingungen mit wenig Arbeitsspeicher nicht mehr gelöscht, daher wird diese Methode niemals aufgerufen."
quelle
Hier gibt es viele veraltete und unvollständige Informationen. Nur für iOS 6 und neuer :
loadView
[ein]viewDidLoad
[ein]viewWillAppear
viewWillLayoutSubviews
ist das erste Mal, dass Grenzen festgelegt werdenviewDidLayoutSubviews
viewDidAppear
*
viewWillLayoutSubviews
[b]*
viewDidLayoutSubviews
[b]Fußnoten:
(a) - Wenn Sie manuell nil aus Ihrer Sicht bei
didReceiveMemoryWarning
,loadView
undviewDidLoad
wieder aufgerufen werden. Das heißt, standardmäßigloadView
und wirdviewDidLoad
nur einmal pro View Controller-Instanz aufgerufen.(b) Kann zusätzlich 0 oder mehrmals aufgerufen werden .
quelle
viewWillLayoutSubviews
undviewDidLayoutSubviews
wird auch zu anderen Zeiten aufgerufen, wenn Unteransichten der Hauptansicht geladen werden, z. B. wenn Zellen einer Tabellenansicht oder einer Sammlungsansicht geladen werden.Erläutern von Zustandsübergängen im offiziellen Dokument: https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/index.html
Dieses Bild zeigt die gültigen Zustandsübergänge zwischen verschiedenen Rückrufmethoden für "Will" und "Did"
Gültige Zustandsübergänge:
Entnommen aus: https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Art/UIViewController Class Reference_2x.png
quelle
Gemäß Apples Dokument - Entwickeln von iOS-Apps (Swift) beginnen - Mit View Controllern arbeiten - Den View Controller-Lebenszyklus verstehen
quelle