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.

Author: Seyyed Parsa Neshaei, 2011-04-06

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ł co ViewWillAppear/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.

 349
Author: Jacob Knobel,
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/

Cykl życia kontrolera widoku, schemat

 374
Author: Haider,
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.

 102
Author: onCompletion,
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.

 32
Author: Rajamohan S,
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:

Tutaj wpisz opis obrazka

 27
Author: Saad,
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.

 18
Author: gjgjgj,
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."

 16
Author: Matt Becker,
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

Schemat cyklu życia UIViewController

Aby uzyskać więcej informacji, zajrzyj do UIViewController Class Reference .

 16
Author: Alexey Pelekh,
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:

  1. loadView[a]
  2. viewDidLoad[a]
  3. viewWillAppear
  4. viewWillLayoutSubviews to pierwszy raz, kiedy granice są finalizowane
  5. viewDidLayoutSubviews
  6. viewDidAppear
  7. * viewWillLayoutSubviews[b]
  8. * 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.

 15
Author: bobics,
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 "

 9
Author: Luismi,
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.

 5
Author: Ashwin Felix,
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.

 0
Author: freddieoh,
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