Jaka jest różnica między-viewWillAppear: a-viewdidappear:?
Jaka jest różnica między -[UIViewController viewWillAppear:]
a -[UIViewController viewDidAppear:]
?
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.
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ń.
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ć.
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)
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
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ł.
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.
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!)
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
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ł.
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ściframe
na podstawie wymiarów głównego widoku, konfiguracja ramki te powinny być odroczone doviewWillAppear
lubviewDidLayoutSubviews
.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
iviewDidAppear
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
iviewDidAppear
będą zwykle wywoływane ponownie, gdy dany Widok zostanie dodany i animowany z powrotem do hierarchii widoku, aleviewDidLoad
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
lubviewDidAppear
. Jeśli chcesz, aby stało się to tylko wtedy, gdy widok jest najpierw utworzony, zrób to wviewDidLoad
. -
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, żeviewWillAppear
jest wywołane, nie oznacza, żeviewDidAppear
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ę
Przykład wbudowanego interaktywnego gestu polega na użyciuviewWillAppear
na "viewMightAppear
, lubviewWillProbablyAppear
, lubiReallyWishThisViewWouldAppear
".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, aviewDidAppear
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 doviewDidAppear
. Jeśli przejście zostanie anulowane, nie będzie to miało miejsca.
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