Jaka jest różnica między-viewWillAppear: a-viewdidappear:?

Jaka jest różnica między -[UIViewController viewWillAppear:] a -[UIViewController viewDidAppear:]?

 121
Author: animuson, 2011-04-12

11 answers

Ogólnie, to jest to, co robię:

1) viewDidLoad - za każdym razem, gdy dodaję kontrolki do widoku, który powinien pojawić się razem z widokiem, od razu umieszczam je w metodzie ViewDidLoad. Zasadniczo metoda ta jest wywoływana zawsze, gdy Widok został załadowany do pamięci. Na przykład, jeśli mój widok jest formularzem z 3 etykietami, dodałbym tutaj etykiety; widok nigdy nie będzie istniał bez tych formularzy.

2) ViewWillAppear: używam viewwillappear zwykle tylko do aktualizacji dane w formularzu. W powyższym przykładzie użyłbym tego do załadowania danych z mojej domeny do formularza. Tworzenie UIViews jest dość kosztowne i należy unikać w miarę możliwości robienia tego w metodzie ViewWillAppear, ponieważ kiedy to zostanie wywołane, oznacza to, że iPhone jest już gotowy, aby pokazać UIView użytkownikowi, a wszystko, co robisz tutaj, wpłynie na wydajność w bardzo widoczny sposób (jak opóźnione animacje itp.).

3) ViewDidAppear : Wreszcie, używam ViewDidAppear, aby rozpocząć nowe wątki do rzeczy, które zajęłyby dużo czasu, jak na przykład robi wywołanie webservice, aby uzyskać dodatkowe dane dla powyższego formularza.Dobrą rzeczą jest to, że ponieważ Widok już istnieje i jest wyświetlany użytkownikowi, możesz pokazać użytkownikowi ładny komunikat "oczekujący" podczas otrzymywania danych.

 273
Author: Chetan Bhalara,
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
2011-04-14 05:39:23

ViewDidLoad ===>>> Umieść tutaj swój kod inicjujący. Nie umieszczaj dynamicznych danych, które mogą ulec zmianie w trakcie cyklu życia widoku. Tak więc, jeśli pobierasz dane z podstawowych danych, nie chcesz tego robić tutaj, jeśli może to ulec zmianie w trakcie życia widoku. Na przykład: powiedzmy, że masz kontroler karty. Przełączasz się z tab1 na tab2 i zmieniasz coś na modelu w tab2. Jeśli wrócisz do tab1 i twój kod modelu został wykonany w viewDidLoad, nie będzie to aktualizowane (zakładając, że nie używasz KVO lub NSFetchedResultsController, itp.).

ViewWillAppear ===>>> jest ona wywoływana za każdym razem, gdy Widok ma się pojawić, niezależnie od tego, czy widok jest już w pamięci. Umieść tutaj swój dynamiczny kod, taki jak logika modelu.

ViewDidAppear ===>>> Umieść tutaj kosztowne operacje, które chcesz wykonać tylko wtedy, gdy masz pewność, że widok jest na ekranie, takie jak Połączenia sieciowe.

Uwaga: jeśli Twoja aplikacja jest w tle i powraca na pierwszy plan, musisz to zrobić za pomocą NSNotificationCenter. Napisałem do tego kod w komentarzach poniżej. Możesz pomyśleć, że viewwillappear/viewdidappear odpali. Umieść tam punkt przerwania i przetestuj go. Nie strzela. Tak więc, jeśli coś się zmieniło w Twojej aplikacji, gdy była w tle, musisz zaktualizować ją za pomocą powiadomień.

 39
Author: smileBot,
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-17 00:42:42

Metoda viewWillAppear jest wywoływana przed załadowaniem rzeczywistego widoku.

Metoda viewDidAppear jest wywoływana, gdy widok jest już załadowany i chcesz coś pokazać.

 11
Author: puneet kathuria,
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
2012-09-17 17:46:57

ViewWillAppear:
■ Wywołane przed dodaniem widoku do hierarchii widoków systemu windows
■ Wywołane wcześniej [vc.view layoutSubviews] (jeśli to konieczne)
viewDidAppear :
■ Wywołane po dodaniu widoku do hierarchii widoku
■ Wywołane po [vc.view layoutSubviews] (jeśli to konieczne)

 7
Author: andyqee,
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-03-11 09:46:36

Viewwillappear wywoła przed załadowaniem widoku, dzięki czemu można wykonać określone zadanie przed załadowaniem tego widoku, a viewdidappear wywoła po załadowaniu widoku, więc zadanie post zostanie wykonane w tej metodzie

 5
Author: dks1725,
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
2011-04-12 05:10:24

Różnica między "will" I "did"... jak sama nazwa wskazuje, viewwillappear jest wywoływany przed pojawieniem się widoku, a viewdidappear jest wywoływany, gdy Widok się pojawił.

 4
Author: Mahesh,
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
2013-04-15 11:52:20

Pierwsze dzieje się przed pojawieniem się widoku, a drugie po nim.

 3
Author: Marc Abramowitz,
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
2011-04-12 05:08:55

Podsumowując:

- viewWillAppear - > update data (reload data from a table view)

- viewDidAppear - > kosztowne operacje(wywołanie API z ładnym HUD postępu!)

 3
Author: Nahuel Roldan,
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-28 19:58:05

1) ViewWillAppear: widok załadowany faktycznie do pamięci, wywołany raz w kontrolerze widoku i miał swoją ramkę, ale nadal nie był wyświetlany użytkownikowi

2) ViewDidAppear: kontroler dodany do hierarchii widoków, dzięki czemu można go przedstawić kolejnemu kontrolerowi, ponadto widok nie układał podviewów

 2
Author: Abuzeid Ibrahim,
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-09-11 14:23:19

Jak sama nazwa wskazuje viewWillAppear jest wywoływana przed pojawieniem się widoku i viewDidAppear jest wywoływana, gdy Widok się pojawił.

 1
Author: visakh7,
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
2011-04-12 05:09:46

Kilka uwag:

  • Metoda viewDidLoad jest wywoływana przy pierwszej instancji widoku. IBOutlet odniesienia są podłączone do czasu, kiedy to zostało wywołane, ale nie wcześniej. frame tego poglądu nie można jednak ustalić do czasu jego wywołania. Jest to świetne miejsce do dodawania / konfigurowania podwidywań i powiązanych z nimi ograniczeń. Ale jeśli robisz dowolną ręczną konfigurację wartości frame na podstawie wymiarów głównego widoku, konfiguracja ramki te powinny być odroczone do viewWillAppear lub viewDidLayoutSubviews.

  • Metoda viewWillAppear jest wywoływana, gdy prezentacja widoku w hierarchii widoku ma się rozpocząć. W szczególności jest to wywoływane na początku animacji (jeśli istnieje) prezentacji widoku. Jego towarzysz, viewWillDisappear jest oczywiście nazywany, gdy zaczyna się przejście od tego widoku.

  • Metoda viewDidAppear jest wywoływana, gdy prezentacja widoku jest wykonywana, zwłaszcza gdy wszystkie powiązane animacja się skończyła. Jego towarzysz, viewDidDisappear jest oczywiście nazywany, gdy przejście od tego widoku jest zrobione.

Dwa ważne zastrzeżenia:

  • viewDidLoad jest wywoływany tylko raz, gdy widok jest uruchamiany po raz pierwszy. Z drugiej strony, viewWillAppear i viewDidAppear będą wywoływane nie tylko wtedy, gdy widok jest prezentowany po raz pierwszy, ale za każdym razem, gdy ten sam widok jest ponownie prezentowany. Na przykład, gdy po raz pierwszy przedstawisz Widok, wszystkie trzy z tych metod zostanie wezwany. Jeśli dany widok następnie przedstawia inny widok, który jest następnie odrzucany, viewWillAppear i viewDidAppear będą zwykle wywoływane ponownie, gdy dany Widok zostanie dodany i animowany z powrotem do hierarchii widoku, ale viewDidLoad nie będą. viewDidLoad jest wywoływana tylko wtedy, gdy ta konkretna instancja została utworzona po raz pierwszy.

    Tak więc, jeśli chcesz coś zrobić za każdym razem, gdy pojawi się widok (np. odrzucisz lub wskakujesz z powrotem do niego), zrób to w viewWillAppear lub viewDidAppear. Jeśli chcesz, aby stało się to tylko wtedy, gdy widok jest najpierw utworzony, zrób to w viewDidLoad.

  • Wywołanie viewWillAppear nie gwarantuje, że przejście do tego widoku zostanie kiedykolwiek zakończone. Szczególnie, jeśli używasz interaktywnych przejść, które są sterowane przez dane wprowadzane przez użytkownika w czasie rzeczywistym, ale to interaktywne przejście może zostać anulowane. To, że viewWillAppear jest wywołane, nie oznacza, że viewDidAppear zadzwoni. Generalnie jest, ale jeśli gest interaktywny zostanie anulowany ,nie będzie (ponieważ przejście nigdy skończone).

    Na WWDC 2013, w kontekście interaktywnych przejść, prezenter zażartował, że powinien zmienić nazwę viewWillAppear na "viewMightAppear, lub viewWillProbablyAppear, lub iReallyWishThisViewWouldAppear".

    Przykład wbudowanego interaktywnego gestu polega na użyciu UINavigationController i "przesunięciu palcem od lewej krawędzi", aby zainicjować pop widoku. viewWillAppear zostanie wywołany dla widoku, do którego wyskakujesz, ale jeśli anulujesz to "przesuń palcem od lewej krawędzi", aby powrócić do widoku, od którego rozpoczął się ten gest pop, pop jest anulowany, a viewDidAppear dla widoku, do którego zacząłeś wracać, nigdy nie zostanie wywołany.

    Efekt netto jest taki, że należy uważać, aby nie napisać kodu, który zakłada, że każde wywołanie do viewWillAppear będzie w końcu wywołane do viewDidAppear. Jeśli przejście zostanie anulowane, nie będzie to miało miejsca.

 1
Author: Rob,
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-09-11 15:19:57