UIViewController viewDidLoad vs. viewWillAppear: jaki jest właściwy podział pracy?

Zawsze byłem trochę niejasny co do rodzaju zadań, które powinny być przypisane do viewDidLoad vs. viewWillAppear: w podklasie UIViewController.

Np. robię aplikację, w której mam UIViewController podklasę uderzającą w serwer, pobierającą dane, przekazującą je do widoku, a następnie wyświetlającą ten widok. Jakie są plusy i minusy robienia tego w viewDidLoad vs. viewWillAppear?

Author: Honey, 2009-10-16

4 answers

ViewDidLoad to rzeczy, które musisz zrobić raz. viewWillAppear jest wywoływany za każdym razem, gdy pojawia się widok. Powinieneś zrobić rzeczy, które musisz zrobić tylko raz w viewDidLoad - na przykład ustawianie tekstów UILabel. Możesz jednak zmodyfikować konkretną część widoku za każdym razem, gdy użytkownik go zobaczy, np. aplikacja iPoda przewija tekst z powrotem do góry za każdym razem, gdy przejdziesz do widoku "Teraz odtwarzane".

Jednak, gdy ładujesz rzeczy z serwera, musisz również pomyśleć o opóźnieniu. Jeśli spakujesz całą komunikację sieciową do viewDidLoad lub viewwillappear, zostaną one wykonane, zanim użytkownik zobaczy Widok - może to spowodować krótkie zamrożenie aplikacji. Dobrym pomysłem może być najpierw pokazanie użytkownikowi niepopularnego widoku ze wskaźnikiem aktywności. Kiedy skończysz z sieci, co może potrwać sekundę lub dwie (lub może nawet zawieść-kto wie?), możesz wypełnić widok swoimi danymi. Dobre przykłady jak można to zrobić można być postrzegane w różnych klientów twitter. Na przykład, gdy przeglądasz stronę szczegółów autora w Twitterrific, widok mówi tylko " Ładowanie..."do czasu zakończenia zapytań sieciowych.

 244
Author: LeonBrussels,
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
2017-12-18 04:15:27

Początkowo używane tylko ViewDidLoad z tableView. Podczas testowania z utratą Wifi, ustawiając urządzenie w tryb samolotowy, zdał sobie sprawę, że tabela nie odświeża się z powrotem Wifi. W rzeczywistości wydaje się, że nie ma możliwości odświeżenia tableView na urządzeniu nawet po naciśnięciu przycisku home z trybem tła ustawionym na yes in-Info.plist.

Moje rozwiązanie:

-(void) viewWillAppear: (BOOL) animated { [self.tableView reloadData];}
 11
Author: Jaminyah,
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-11-29 21:15:06

Ważne jest, aby pamiętać, że używanie viewDidLoad do pozycjonowania jest nieco ryzykowne i należy go unikać, ponieważ granice nie są ustawione. może to spowodować nieoczekiwane rezultaty (miałem różne problemy...)

Ten post dość dobrze opisuje różne metody i to, co dzieje się w każdej z nich.

Obecnie dla jednorazowego init i pozycjonowanie myślę o użyciu viewdidappear z flagą, jeśli ktoś ma jakieś inne zalecenia proszę dać mi znać.

 10
Author: keisar,
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-06-26 17:49:43

Zależy, czy dane muszą być ładowane co Po otwarciu widoku? czy tylko raz ?

Tutaj wpisz opis obrazka

  • Nie wymagają zmiany za każdym razem. Po załadowaniu pozostają takie, jakie były.
  • Fioletowy: muszą zmieniać się w czasie lub po załadowaniu za każdym razem. Nie chcesz zobaczyć tych samych 3 sugerowanych użytkowników do naśladowania, musi być przeładowany za każdym razem, gdy wrócisz na ekran. Ich zdjęcia mogą bądź na bieżąco... nie chcesz zobaczyć zdjęcia sprzed 5 lat...

viewDidLoad: jakiekolwiek przetwarzanie masz, które musi być wykonane raz.
viewWilLAppear: niezależnie od przetwarzania, które musi się zmieniać za każdym razem, gdy strona jest ładowana.

Etykiety, ikony, tytuły przycisków lub większość dataInputedByDeveloper zazwyczaj nie ulegają zmianie. Nazwy, zdjęcia, linki, status przycisków, listy (Tablice wejściowe dla tableViews lub collectionView) lub większość dataInputedByUser zazwyczaj do zmiana.

 3
Author: Honey,
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
2017-10-16 12:04:02