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 UIViewControllerpeł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, UIViewjeś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 viewwłaściwości Nie wywoływaj super metody, gdy przesłonisz
loadView
2) loadViewIfNeeded
Jeśli viewControllernie 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
viewDidLoadZdarzenie 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 viewControllerkaż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 viewDidAppearZdarzenie 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 viewWillDisappearZdarzenie gdy pogląd przedstawiony viewControllerjest 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 superimplementacji 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 -loadViewmetoda 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 -viewwywołaniem go, albo zastąpić -loadViewmetodę programowego konfigurowania twoich widoków.
Mam nadzieję, że to pomogło. Dzięki.
AKTUALIZACJA - Jak wskazał @ThomasW w komentarzu viewWillLayoutSubviewsi viewDidLayoutSubviewsbę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, loadViewzaktualizowano opis