Czy możesz wyjaśnić mi prawidłowy sposób zarządzania UIViewController
cyklem życia?
W szczególności chciałbym wiedzieć, jak korzystać Initialize
, ViewDidLoad
, ViewWillAppear
, ViewDidAppear
, ViewWillDisappear
, ViewDidDisappear
, ViewDidUnload
i Dispose
metody Mono Dotyk dla UIViewController
klasy.
ios
uiviewcontroller
xamarin.ios
lifecycle
Lorenzo B.
źródło
źródło
Odpowiedzi:
Wszystkie te polecenia są wywoływane automatycznie przez iOS w odpowiednim czasie, gdy ładujesz / prezentujesz / ukrywasz kontroler widoku. Ważne jest, aby pamiętać, że metody te są przywiązane do samych siebie,
UIViewController
a nie doUIView
nich. Nie uzyskasz żadnej z tych funkcji tylko przy użyciuUIView
.Jest świetna dokumentacja na stronie Apple tutaj . Mówiąc prosto:
ViewDidLoad
- Wywoływany podczas tworzenia klasy i ładowania z Xib. Idealne do początkowej konfiguracji i jednorazowej pracy.ViewWillAppear
- Wywoływany tuż przed pojawieniem się widoku, dobry do ukrywania / pokazywania pól lub wszelkich operacji, które chcesz wykonać za każdym razem, zanim widok będzie widoczny. Ponieważ możesz poruszać się między widokami, będzie to wywoływane za każdym razem, gdy twój widok pojawi się na ekranie.ViewDidAppear
- Wywoływany po wyświetleniu widoku - świetne miejsce do rozpoczęcia animacji lub ładowania danych zewnętrznych z interfejsu API.ViewWillDisappear
/DidDisappear
- Taki sam pomysł jakViewWillAppear
/ViewDidAppear
.ViewDidUnload
/ViewDidDispose
- W Objective-C, tutaj robisz porządki i wypuszczasz rzeczy, ale jest to obsługiwane automatycznie, więc nie musisz nic więcej robić.źródło
AKTUALIZACJA: ViewDidUnload został przestarzały w iOS 6, więc odpowiednio zaktualizowałem odpowiedź.
Cykl życia UIViewController przedstawiono tutaj:
Zaletą korzystania z Xamarin Native / Mono Touch jest to, że korzysta z natywnych interfejsów API, a zatem przebiega w tym samym cyklu życia ViewController, jak w dokumentacji Apple.
źródło
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.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.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.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.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.
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.
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.8
viewWillDisappear
W
viewWillDisappear
Zdarzenie gdy pogląd przedstawionyviewController
jest o zniknąć oddalenie, pokrywę lub chować się za innychviewController
. To dobre miejsce, w którym możesz ograniczyć połączenia sieciowe, unieważnić timer lub zwolnić związane z tym obiektyviewController
.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 .Teraz, tak jak Apple , wdrażając te metody, powinieneś pamiętać o wywołaniu
super
implementacji tej konkretnej metody.Mam nadzieję, że to pomogło. Dzięki.
AKTUALIZACJA - Jak wskazał @ThomasW w komentarzu
viewWillLayoutSubviews
iviewDidLayoutSubviews
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źródło
viewWillLayoutSubviews
iviewDidLayoutSubviews
będzie również wywoływany w innych momentach, gdy załadowane zostaną widoki podrzędne głównego widoku, na przykład, gdy załadowane zostaną komórki widoku tabeli lub widoku kolekcji.viewWillAppear
viewDidAppear
viewDidDisappear
. W pewnym momencie musisz zadzwonić super.iOS 10,11 (Swift 3.1, Swift 4.0)
Zgodnie
UIViewController
zUIKit
deweloperów,1. loadView ()
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.
2. loadViewIfNeeded ()
Ładuje widok kontrolera widoku, jeśli nie został jeszcze ustawiony.
3. viewDidLoad ()
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 (_ animowane: Bool)
Wywoływany, gdy widok ma być widoczny. Domyślnie nic nie robi
5. viewWillLayoutSubviews ()
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 nic nie robi.
6. viewDidLayoutSubviews ()
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 nic nie robi.
7. viewDidAppear (_ animowane: Bool)
Wywoływany, gdy widok został w pełni przeniesiony na ekran. Domyślnie nic nie robi
8. viewWillDisappear (_ animowane: Bool)
Wywoływany, gdy widok zostanie odrzucony, zakryty lub w inny sposób ukryty. Domyślnie nic nie robi
9. viewDidDisappear (_ animowane: Bool )
Wywoływany po tym, jak widok został odrzucony, zakryty lub w inny sposób ukryty. Domyślnie nic nie robi
10. viewWillTransition (na wymiar: CGSize, ze koordynatorem: UIViewControllerTransitionCoordinator)
Wywoływany, gdy widok jest przejściowy.
11. willMove (rodzic toParentViewController: UIViewController?)
12. didMove (toParentViewController rodzic: UIViewController?)
Te dwie metody są publiczne dla podklas kontenerów do wywoływania podczas przechodzenia między kontrolerami potomnymi. Jeśli zostaną zastąpione, przesłonięcia powinny zapewnić wywołanie super.
Argument nadrzędny w obu tych metodach jest zerowy, gdy dziecko jest usuwane z jego rodzica; w przeciwnym razie jest równy nowemu nadrzędnemu kontrolerowi widoku.
13. didReceiveMemoryWarning ()
Wywoływany, gdy aplikacja nadrzędna otrzyma ostrzeżenie o pamięci. W iOS 6.0 domyślnie nie wyczyści widoku.
źródło
nib
wspomniane poniżejloadView
?viewWillLayoutSubviews()
jest wywoływana, zanim obiekt widoku ViewController wywoła swojąlayoutSubviews()
metodęPocząwszy od iOS 6 i nowszych. Nowy schemat wygląda następująco:
źródło
Skoncentrujmy się na metodach odpowiedzialnych za cykl życia UIViewController :
Kreacja:
- (void)init
- (void)initWithNibName:
Zobacz tworzenie:
- (BOOL)isViewLoaded
- (void)loadView
- (void)viewDidLoad
- (UIView *)initWithFrame:(CGRect)frame
- (UIView *)initWithCoder:(NSCoder *)coder
Obsługa zmiany stanu widoku:
- (void)viewDidLoad
- (void)viewWillAppear:(BOOL)animated
- (void)viewDidAppear:(BOOL)animated
- (void)viewWillDisappear:(BOOL)animated
- (void)viewDidDisappear:(BOOL)animated
- (void)viewDidUnload
Obsługa ostrzeżeń pamięci:
- (void)didReceiveMemoryWarning
Zwolnienie
- (void)viewDidUnload
- (void)dealloc
Aby uzyskać więcej informacji, zapoznaj się z dokumentacją klasy UIViewController .
źródło
Metody
viewWillLayoutSubviews
iviewDidLayoutSubviews
nie są wymienione na schematach, ale są one wywoływane międzyviewWillAppear
iviewDidAppear
. Można je wywoływać wiele razy.źródło
Odpowiedź Haidera jest poprawna dla wersji wcześniejszych niż iOS 6. Jednak od iOS 6 viewDidUnload i viewWillUnload nigdy nie są wywoływane. Docs stan: „Widoki nie są już oczyszczone w warunkach niskiej pamięci i tak ta metoda nie jest tzw.”
źródło
Jest tu wiele nieaktualnych i niepełnych informacji. Tylko dla iOS 6 i nowszych :
loadView
[za]viewDidLoad
[za]viewWillAppear
viewWillLayoutSubviews
jest to, że granice po raz pierwszy są finalizowaneviewDidLayoutSubviews
viewDidAppear
*
viewWillLayoutSubviews
[b]*
viewDidLayoutSubviews
[b]Przypisy:
(a) - Jeśli ręcznie nil swój pogląd w czasie
didReceiveMemoryWarning
,loadView
iviewDidLoad
będzie nazwany ponownie. Oznacza to, że domyślnieloadView
iviewDidLoad
tylko jest wywoływana raz na widoku kontrolera instancji.(b) Można nazwać dodatkowe 0 lub więcej razy.
źródło
viewWillLayoutSubviews
iviewDidLayoutSubviews
będzie również wywoływany w innych momentach, gdy załadowane zostaną widoki podrzędne głównego widoku, na przykład, gdy załadowane zostaną komórki widoku tabeli lub widoku kolekcji.Wyjaśnienie zmian stanu w oficjalnym dokumencie: https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/index.html
Ten obraz pokazuje prawidłowe przejścia stanu między różnymi metodami wywołania zwrotnego „will” i „did”
Prawidłowe zmiany stanu:
Zaczerpnięte z: https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Art/UIViewController Class Reference_2x.png
źródło
Zgodnie z dokumentem Apple'a - Rozpocznij tworzenie aplikacji na iOS (Swift) - Pracuj z kontrolerami widoku - Poznaj cykl życia kontrolera widoku
źródło