Szukam zrozumienia cyklu życia iOS UIViewController
Czy możesz mi wyjaśnić, jak prawidłowo zarządzać cyklem życia?
W szczególności chciałbym wiedzieć, jak używać Initialize
, ViewDidLoad
, ViewWillAppear
, ViewDidAppear
, ViewWillDisappear
, ViewDidDisappear
, ViewDidUnload
i Dispose
metody W mono Touch dla klasy UIViewController
.
12 answers
Wszystkie te polecenia są wywoływane automatycznie w odpowiednich momentach przez system iOS, gdy wczytujesz/prezentujesz / ukrywasz kontroler widoku. Ważne jest, aby pamiętać, że te metody są dołączone do UIViewController
, a nie do UIView
. Nie otrzymasz żadnej z tych funkcji za pomocą UIView
.
Jest świetna dokumentacja na stronie Apple tutaj . Wpisując po prostu:
ViewDidLoad
- wywołane podczas tworzenia klasy i ładowania z xib. Świetne do wstępnej konfiguracji i Jednorazowa praca.ViewWillAppear
- wywoływane tuż przed pojawieniem się widoku, dobre do ukrywania / pokazywania pól lub wszelkich operacji, które mają być wykonywane za każdym razem, zanim widok będzie widoczny. Ponieważ możesz przechodzić między widokami, będzie to wywoływane za każdym razem, gdy Widok pojawi się na ekranie.ViewDidAppear
- wywołane po pojawieniu się widoku-świetne miejsce na rozpoczęcie animacji lub załadowanie danych zewnętrznych z API.ViewWillDisappear
/DidDisappear
- ten sam pomysł coViewWillAppear
/ViewDidAppear
.ViewDidUnload
/ViewDidDispose
- W celu C, to jest miejsce, gdzie robisz swoje sprzątanie i uwalnianie rzeczy, ale to jest obsługiwane automatycznie, więc nie wiele naprawdę trzeba zrobić tutaj.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-14 15:59:49
Cykl życia UIViewController jest przedstawiony tutaj:
Http://rdkw.wordpress.com/2013/02/24/ios-uiviewcontroller-lifecycle/
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-29 12:44:28
To jest dla najnowszych wersji iOS (zmodyfikowane z Xcode 9.3, Swift 4.1 ). Poniżej znajdują się wszystkie etapy, które sprawiają, że cykl życia UIViewController
jest kompletny.
LoadView ()
Loadviewifne ()
ViewDidLoad ()
ViewWillAppear (_animated: Bool)
ViewWillLayoutSubviews ()
ViewDidLayoutSubviews ()
ViewDidAppear (_animated: Bool)
ViewWillDisappear (_animated: Bool)
ViewDidDisappear(_ animowane: Bool)
Pozwól mi wyjaśnić te wszystkie etapy.1. loadView
To zdarzenie tworzy widok, którym zarządza kontroler. Jest wywoływany tylko wtedy, gdy kontroler widoku jest tworzony programowo. To sprawia, że jest to dobre miejsce do tworzenia widoków w kodzie.
This is where subclasses should create their custom view hierarchy if they aren't using a nib.
Should never be called directly.
2. loadViewIfNeeded
Jeśli widok bieżącego viewController
nie został jeszcze ustawiony, to ta metoda załaduje widok, ale pamiętaj, że jest on dostępny tylko w iOS > = 9.0. Więc jeśli wspierasz iOS
Loads the view controller's view if it has not already been set.
3. viewDidLoad
Zdarzenie viewDidLoad
jest wywoływane tylko wtedy, gdy widok jest tworzony i ładowany do pamięci, ale granice widoku nie są jeszcze zdefiniowane. Jest to dobre miejsce do inicjalizacji obiektów, których będzie używał kontroler widoku.
Called after the view has been loaded. For view controllers created in code, this is after -loadView.
For view controllers unarchived from a nib, this is after the view is set.
4. viewWillAppear
To zdarzenie powiadamia viewController
za każdym razem, gdy Widok pojawi się na ekran. W tym kroku Widok ma granice, które są zdefiniowane, ale orientacja nie jest ustawiona.
Called when the view is about to made visible. Default does nothing.
5. viewWillLayoutSubviews
Jest to pierwszy etap cyklu życia, w którym granice są finalizowane. Jeśli nie używasz ograniczeń lub układu automatycznego, prawdopodobnie chcesz zaktualizować podglądy tutaj. Jest to dostępne tylko w systemie iOS >=5.0. Więc jeśli wspierasz iOS
Called just before the view controller's view's layoutSubviews method is invoked.
Subclasses can implement as necessary. The default is a nop.
6. viewDidLayoutSubviews
To zdarzenie powiadomi kontroler widoku, że podglądy zostały skonfigurowane. Jest to dobre miejsce, aby wprowadzić wszelkie zmiany w podwidywaniach po ich ustawieniu. Jest to dostępne tylko w systemie iOS >=5.0. Więc jeśli wspierasz iOS
Called just after the view controller's view's layoutSubviews method is invoked.
Subclasses can implement as necessary. The default is a nop.
7. viewDidAppear
Zdarzenie viewDidAppear
zostanie wywołane Po wyświetleniu widoku na ekranie. Co sprawia, że jest to dobre miejsce do pobierania danych z backendu serwis lub baza danych.
Called when the view has been fully transitioned onto the screen.
Default does nothing
8. viewWillDisappear
Zdarzenie viewWillDisappear
zostanie wywołane, gdy Widok prezentowanego viewController
ma zniknąć, odrzucić, zasłonić lub ukryć się za innymi viewController
. Jest to dobre miejsce, gdzie możesz ograniczyć połączenia sieciowe, unieważnić timer lub zwolnić obiekty, które są powiązane z tym viewController
.
Called when the view is dismissed, covered or otherwise hidden.
9. viewDidDisappear
Jest to ostatni etap cyklu życia, który każdy może rozwiązać, ponieważ to zdarzenie zostanie wywołane po tym, jak widok przedstawionego viewController
został zniknięty, odrzucony, zakryty lub ukryty.
Called after the view was dismissed, covered or otherwise hidden.
Default does nothing
Teraz zgodnie z Apple podczas implementacji tych metod należy pamiętać o wywołaniu super
implementacji tej konkretnej metody.
If you subclass UIViewController, you must call the super implementation of this
method, even if you aren't using a NIB. (As a convenience, the default init method will do this for you,
and specify nil for both of this methods arguments.) In the specified NIB, the File's Owner proxy should
have its class set to your view controller subclass, with the view outlet connected to the main view. If you
invoke this method with a nil nib name, then this class' -loadView method will attempt to load a NIB whose
name is the same as your view controller's class. If no such NIB in fact exists then you must either call
-setView: before -view is invoked, or override the -loadView method to set up your views programatically.
Mam nadzieję, że to pomogło.
Dzięki.
UPDATE - Jak @ ThomasW wskazał w komentarzu viewWillLayoutSubviews
i viewDidLayoutSubviews
będą również wywoływane w innych momentach, gdy wczytane zostaną podwidywarki głównego widoku, na przykład gdy komórki tabeli widok lub widok kolekcji są ładowane.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-03 17:36:50
IOS 10,11 (Swift 3.1, Swift 4.0)
Według UIViewController
W UIKit
deweloperzy,
1. loadView()
Tutaj podklasy powinny tworzyć własną hierarchię widoków, jeśli nie używają nib . Nigdy nie należy dzwonić bezpośrednio.
2. loadViewIfNeeded()
Wczytuje widok kontrolera widoku, jeśli nie został on jeszcze ustawiony.
3. viewDidLoad()
Wywołane po widoku został załadowany. W przypadku kontrolerów widoków utworzonych w kodzie jest to funkcja after-loadView. W przypadku kontrolerów widoku niezarchiwizowanych z nib, dzieje się to po ustawieniu widoku.
4. viewWillAppear (_animated: Bool)
Wywołane, gdy Widok ma być widoczny. Default does nothing
5. viewWillLayoutSubviews()
Wywołane zaraz po wywołaniu metody layoutsubview kontrolera widoku. Podklasy mogą być wdrażane w razie potrzeby.
6. viewDidLayoutSubviews()
Wywołane, gdy rozmiar, pozycja i ograniczenia są stosowane do wszystkich obiektów.
7. viewDidAppear (_animated: Bool)
Wywołane, gdy Widok został w pełni przeniesiony na ekran. Default does nothing
8. viewWillDisappear (_animated: Bool)
Wywołane, gdy widok jest odrzucony, zakryty lub w inny sposób ukryty. Default does nothing
9. viewDidDisappear (_animowany: Bool )
Wywołane po tym, jak widok został odrzucony, zakryty lub w inny sposób ukryty. Default does nothing
10. viewWillTransition (to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)
Wywołane podczas przejścia widoku.
11. willMove (toparentviewcontroller parent: UIViewController?)
12. didMove (toparentviewcontroller parent: UIViewController?)
Te dwie metody są publiczne dla kontenera podklasy do wywołania podczas przechodzenia między kontrolerami potomnymi. Jeśli są przesłonięte, przesłonięcia powinny zapewnić, aby zadzwonić do super.
Argument rodzica w obu tych metodach jest zerowy, gdy potomek jest usuwany z rodzica; w przeciwnym razie jest równy nowemu kontrolerowi widoku rodzica.
13. didReceiveMemoryWarning()
Wywołane, gdy aplikacja nadrzędna otrzyma ostrzeżenie o pamięci. W systemie iOS 6.0 domyślnie widok nie będzie już czyszczony.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-31 12:33:34
Od iOS 6 i dalej. Nowy schemat wygląda następująco:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-08 07:04:00
Metody viewWillLayoutSubviews
i viewDidLayoutSubviews
nie są wymienione na diagramach, ale są one nazywane pomiędzy viewWillAppear
i viewDidAppear
. Można je wywoływać wielokrotnie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-18 20:33:33
Odpowiedź Haidera jest poprawna dla pre-iOS 6. Jednak od iOS 6 viewDidUnload i viewWillUnload nigdy nie są wywoływane. Stan docs: "widoki nie są już czyszczone w warunkach niskiej pamięci, więc ta metoda nigdy nie jest wywoływana."
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-23 18:17:53
Skupmy się na metodach, które są odpowiedzialne za cykl życia UIViewController ' S:
-
Creation:
- (void)init
- (void)initWithNibName:
-
Tworzenie widoku:
- (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
-
Dealokacja
- (void)viewDidUnload
- (void)dealloc
Aby uzyskać więcej informacji, zajrzyj do UIViewController Class Reference .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-12 09:43:28
Jest tu wiele nieaktualnych i niekompletnych informacji. Tylko dla iOS 6 i nowszych:
-
loadView
[a] -
viewDidLoad
[a] viewWillAppear
-
viewWillLayoutSubviews
to pierwszy raz, kiedy granice są finalizowane viewDidLayoutSubviews
viewDidAppear
-
*
viewWillLayoutSubviews
[b] -
*
viewDidLayoutSubviews
[b]
Przypisy:
(a) - jeśli ręcznie zerujesz widok podczas didReceiveMemoryWarning
, loadView
i viewDidLoad
zostanie wywołana ponownie. Oznacza to, że domyślnie loadView
i viewDidLoad
są wywoływane tylko raz na instancję kontrolera widoku.
b) może być nazywany dodatkowym 0 albo więcej razy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-06 06:58:02
Wyjaśnienie zmian stanu w oficjalnym dokumencie: https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/index.html
Ten obrazek pokazuje poprawne przejścia stanu pomiędzy różnymi metodami wywołania zwrotnego "will" I " did "
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-20 21:54:52
init(coder:)
Podczas tworzenia widoków aplikacji w Storyboardzie, init(coder:)
jest metodą, która zostaje wywołana, aby utworzyć instancję kontrolera widoku i przywrócić go do życia. Kontrakt dla tej metody jest faktycznie zdefiniowany w protokole NSCoding, więc nie zobaczysz go w dokumentacji UIViewController
.
Kiedy ta metoda zostanie wywołana, twój widok prawdopodobnie zostanie wyświetlony w niedalekiej przyszłości (lub bardzo najbliższej przyszłości), ale w tym momencie nie ma gwarancji, że rzeczywiście zostanie wyświetlony. Więc to może być dobry czas, aby zacząć wszystko w porządku, ale nie za dużo tutaj, bo będziesz marnować moc przetwarzania. W tej metodzie można utworzyć instancje zależności, w tym podwidywań, które zostaną dodane do widoku programowo. Zauważ, że init(coder:)
jest wywoływana tylko raz w ciągu życia obiektu, tak jak wszystkie metody init.
viewDidLoad()
Wywołana po init(coder:)
gdy Widok zostanie załadowany do pamięci, metoda ta jest również wywoływana tylko raz w ciągu życia kontrolera widoku obiekt. Jest to świetne miejsce do inicjalizacji lub konfiguracji widoku, których nie zrobiłeś w Storyboardzie. Być może chcesz programowo dodawać podglądy lub ograniczenia układu automatycznego – jeśli tak, to jest to świetne miejsce do wykonania jednego z nich. Zauważ, że tylko dlatego, że Widok został załadowany do pamięci, nie musi oznaczać, że wkrótce zostanie wyświetlony – w tym celu warto spojrzeć na viewWillAppear
. I pamiętaj, aby wywołać super.viewDidLoad()
w swojej implementacji, aby upewnić się, że viewDidLoad Twojej superklasy otrzyma szansa na wykonanie swojej pracy - zwykle nazywam super zaraz na początku realizacji.
viewWillAppear(_:)
Zawsze wywoływane po viewDidLoad
(z oczywistych powodów, jeśli się nad tym zastanowić), a tuż przed pojawieniem się widoku na ekranie użytkownika, wywoływane jest viewWillAppear
. Daje to możliwość wykonania dowolnej konfiguracji widoku w ostatniej chwili, uruchomienia żądania sieciowego (oczywiście w innej klasie) lub odświeżenia ekranu. W przeciwieństwie do viewDidLoad
, viewWillAppear
jest wywoływany przy pierwszym wyświetleniu widoku, jak również wtedy, gdy widok jest wyświetlany ponownie, dzięki czemu może być wywoływany wielokrotnie w ciągu życia obiektu kontrolera widoku. Jest wywoływany, gdy Widok ma się pojawić w wyniku naciśnięcia przycisku Wstecz, zamknięcia okna dialogowego modalnego, gdy karta kontrolera widoku jest zaznaczona w kontrolerze paska kart lub z wielu innych powodów. Upewnij się, że wywołujesz super.viewWillAppear()
w pewnym momencie implementacji-zazwyczaj robię to najpierw.
viewWillDisappear(_:)
Podobnie jak viewWillAppear
, metoda ta jest wywoływana tuż przed widokiem znika z ekranu. I podobnie jak viewWillAppear
, metoda ta może być wywoływana wiele razy w ciągu życia obiektu kontrolera widoku. Jest wywoływany, gdy użytkownik porusza się z dala od ekranu-być może oddalając ekran, wybierając inną kartę, dotykając przycisku, który pokazuje widok modalny lub nawigując dalej w dół hierarchii nawigacji. Jest to świetne miejsce, aby ukryć klawiaturę, zapisać stan i ewentualnie anulować uruchomione timery lub żądania sieciowe. Podobnie jak inne metody w kontrolerze widoku cykl życia, należy zadzwonić super
w pewnym momencie viewWillDisappear
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-12 13:25:10
Według Apple docs
viewDidLoad
- wywoływane, gdy Widok zawartości kontrolera widoku (Góra jego hierarchii widoków) jest tworzony i ładowany z storyboardu. Użyj tej metody, aby wykonać dowolną dodatkową konfigurację wymaganą przez kontroler widoku.
viewWillAppear
- wywoływane tuż przed dodaniem widoku zawartości kontrolera widoku do hierarchii widoków aplikacji. Użyj tej metody, aby wywołać wszelkie operacje, które muszą zostać wykonane przed wyświetlaniem widoku zawartości na ekranie
viewDidAppear
- Wywoływane zaraz po dodaniu widoku zawartości kontrolera widoku do hierarchii widoków aplikacji. Użyj tej metody, aby uruchomić wszelkie operacje, które muszą zostać wykonane natychmiast po wyświetleniu widoku na ekranie, takie jak pobieranie danych lub wyświetlanie animacji.
viewWillDisappear
- wywołane tuż przed usunięciem widoku zawartości kontrolera widoku z hierarchii widoków aplikacji. Użyj tej metody do wykonywania zadań czyszczenia, takich jak zatwierdzanie zmian lub rezygnacja ze statusu osoby odpowiedzialnej.
viewDidDisappear
- Called tuż po usunięciu widoku zawartości kontrolera widoku z hierarchii widoków aplikacji. Użyj tej metody, aby wykonać dodatkowe czynności rozdzierania.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-04 00:54:15