Dotyczy to najnowszych wersji iOS (zmodyfikowanych za pomocą Xcode 9.3, Swift 4.1 ). Poniżej znajdują się wszystkie etapy, które składają się na UIViewController
pełny cykl życia .
loadView()
loadViewIfNeeded()
viewDidLoad()
viewWillAppear(_ animated: Bool)
viewWillLayoutSubviews()
viewDidLayoutSubviews()
viewDidAppear(_ animated: Bool)
viewWillDisappear(_ animated: Bool)
viewDidDisappear(_ animated: Bool)
Pozwól mi wyjaśnić wszystkie te etapy.
1. loadView
To zdarzenie tworzy / ładuje widok zarządzany przez kontroler. Może zostać załadowany ze skojarzonego pliku stalówki lub pusty, UIView
jeśli znaleziono wartość NULL. To sprawia, że jest to dobre miejsce do programowego tworzenia widoków w kodzie.
W tym miejscu podklasy powinny tworzyć własną hierarchię widoków, jeśli nie używają stalówki. Nigdy nie należy dzwonić bezpośrednio. Zastępuj tę metodę tylko wtedy, gdy programowo tworzysz widoki i przypisujesz widok główny do view
właściwości Nie wywoływaj super metody, gdy przesłonisz
loadView
2) loadViewIfNeeded
Jeśli viewController
nie ustawiono jeszcze widoku prądu, ta metoda załaduje widok, ale pamiętaj, że jest to dostępne tylko w iOS> = 9.0. Więc jeśli wspierasz iOS <9.0, nie oczekuj, że pojawi się na zdjęciu.
Ładuje widok kontrolera widoku, jeśli nie został jeszcze ustawiony.
3) viewDidLoad
viewDidLoad
Zdarzenie jest wywoływane tylko wtedy, gdy widok jest tworzony i ładowane do pamięci, ale granice dla widoku nie są jeszcze zdefiniowane. Jest to dobre miejsce do inicjalizacji obiektów, które będą używane przez kontroler widoku.
Wywoływany po załadowaniu widoku. W przypadku kontrolerów widoku utworzonych w kodzie jest to po -loadView. W przypadku kontrolerów widoku niezarchiwizowanych z końcówki następuje to po ustawieniu widoku.
4 viewWillAppear
To zdarzenie powiadamia o viewController
każdym wyświetleniu widoku na ekranie. W tym kroku widok ma zdefiniowane granice, ale orientacja nie jest ustawiona.
Wywoływany, gdy widok ma być widoczny. Domyślnie nic nie robi.
5 viewWillLayoutSubviews
To pierwszy krok w cyklu życia, w którym granice są finalizowane. Jeśli nie używasz ograniczeń ani automatycznego układu, prawdopodobnie chcesz tutaj zaktualizować widoki podrzędne. Jest to dostępne tylko w iOS> = 5.0. Więc jeśli wspierasz iOS <5.0, nie oczekuj, że pojawi się na zdjęciu.
Wywoływany tuż przed wywołaniem układu widoku kontrolera widoku Metoda Subviews jest wywoływana. Podklasy można wdrażać w razie potrzeby. Domyślnie jest to nop.
6. viewDidLayoutSubviews
To zdarzenie powiadamia kontroler widoku, że podviewy zostały skonfigurowane. Jest to dobre miejsce do wprowadzania zmian w widokach podrzędnych po ich ustawieniu. Jest to dostępne tylko w iOS> = 5.0. Więc jeśli wspierasz iOS <5.0, nie oczekuj, że pojawi się na zdjęciu.
Wywoływany zaraz po wywołaniu układu widoku kontrolera widoku Metoda Subviews jest wywoływana. Podklasy można wdrażać w razie potrzeby. Domyślnie jest to nop.
7 viewDidAppear
W viewDidAppear
Zdarzenie po widzenia prezentowany jest na ekranie. Co sprawia, że jest to dobre miejsce na uzyskanie danych z usługi zaplecza lub bazy danych.
Wywoływany, gdy widok został w pełni przeniesiony na ekran. Domyślnie nic nie robi
8 viewWillDisappear
W viewWillDisappear
Zdarzenie gdy pogląd przedstawiony viewController
jest o zniknąć oddalenie, pokrywę lub chować się za innych viewController
. To dobre miejsce, w którym możesz ograniczyć połączenia sieciowe, unieważnić timer lub zwolnić związane z tym obiektyviewController
.
Wywoływany, gdy widok zostanie odrzucony, zakryty lub w inny sposób ukryty.
9 viewDidDisappear
Jest to ostatni etap cyklu życia, którym każdy może się zająć, ponieważ to wydarzenie jest uruchamiane tuż po wyświetleniu widoku viewController
zniknięciu, odrzuceniu, zasłonięciu lub ukryciu .
Wywoływany po tym, jak widok został odrzucony, zakryty lub w inny sposób ukryty. Domyślnie nic nie robi
Teraz, tak jak Apple , wdrażając te metody, powinieneś pamiętać o wywołaniu super
implementacji tej konkretnej metody.
Jeśli podklasujesz UIViewController, musisz wywołać super implementację tej metody, nawet jeśli nie używasz NIB. (Dla wygody domyślna metoda init zrobi to za Ciebie i określi zero dla obu argumentów tych metod.) W określonym NIB, proxy właściciela pliku powinno mieć klasę ustawioną na podklasę kontrolera widoku, z ujściem widoku podłączony do głównego widoku. Jeśli wywołasz tę metodę z zerową nazwą końcówki, wówczas -loadView
metoda tej klasy spróbuje załadować NIB, którego nazwa jest taka sama jak klasa twojego kontrolera widoku. Jeśli tak naprawdę nie ma takiego NIB, musisz albo wywołać -setView:
przed -view
wywołaniem go, albo zastąpić -loadView
metodę programowego konfigurowania twoich widoków.
Mam nadzieję, że to pomogło. Dzięki.
AKTUALIZACJA - Jak wskazał @ThomasW w komentarzu viewWillLayoutSubviews
i viewDidLayoutSubviews
będzie również wywoływany w innych momentach, gdy ładowane są widoki podrzędne głównego widoku, na przykład, gdy ładowane są komórki widoku tabeli lub widoku kolekcji.
AKTUALIZACJA - Jak wskazał @Maria w komentarzu, loadView
zaktualizowano opis