2013-02-18 8 views
12

Mam następujący kod w kontrolerze szczegół Widok:Metoda nazywa się -viewWillLayoutSubviews niewytłumaczalny sposób przebiega dwukrotnie

- (void)viewWillLayoutSubviews { 
    [super viewWillLayoutSubviews]; 
    [self configureView]; 
} 

Kiedy segue do tego kontrolera widoku z przerwania na pierwszej linii -configureView wydaje się, że [self configureView] jest wywoływana dwa razy. Jednakże:

  • Zarówno razy metoda jest trafiony, stos wygląda tak:

stack

  • Kiedy skomentować [self configureView] w powyższym kodzie, to hit zero razy.
  • Jak wynika z tego, że stos jest taki sam, oba razy, -configureView nie wywołuje się rekursywnie.
  • -configureView jest wywoływana tylko w powyższym kodzie.
+0

Więc 'viewWillLayoutSubviews' zostaje wywołane dwa razy? W takim razie pojawia się pytanie, co powoduje ponowne ustawienie układu w kontrolerze widoku? – abellina

+0

Tak, dobra uwaga. Pytanie brzmi, dlaczego '-viewWillLayoutSubviews' wywoływane jest dwa razy. W dokładnie taki sam sposób na stosie. –

Odpowiedz

1

Jeśli postępujesz zgodnie ze zwykłymi wzorami, wówczas configureView jest wywoływane w ustawieniu detailItem. Sprawdź metodę setera. I [detailViewController setDetailItem:something] jest często wywoływana w prepareForSegue:.

Najważniejsze pytanie: czy to ma znaczenie?

+1

Wywołuję go w widoku '-viewWillLayoutSubviews', ponieważ chcę, aby wartości były aktualizowane z modelu za każdym razem, gdy widoki są ułożone. Wywołanie go w ustawieniach ma bardziej strukturalny sens, ale prowadzi do tego, że widoki nie są aktualizowane przed przejściem, co prowadzi do prezentacji nieaktualnych danych. Tak czy owak, wydaje się, że z całą pewnością ma to znaczenie! Po pierwsze, chciałbym zrozumieć zachowanie. Co się stanie, jeśli chcę intensywnej operacji w tej metodzie? Dlaczego powinien wykonać dwa razy? –

+1

Nie powiedziałem, że musisz to nazwać od setera. Chcę tylko dać wskazówkę, że możesz nazwać ją również od setera, co może spowodować dwukrotne wywołanie. To wszystko. Jednak nie jestem przekonany, że jest to odpowiednie miejsce do odświeżenia danych z modelu. viewWillAppear powinno wystarczyć do tego celu. –

+0

Dzięki Hermann! Przyjmę raport tutaj. Zastanawiam się, w jaki sposób cytat: "Programiści marnują ogromną ilość czasu na myślenie lub martwienie się o niekrytyczne części swoich programów ..." autorstwa Knuth (http://c2.com/cgi/wiki?PrematureOptimization) .Po prostu staram się upewnić, że rozumiem, jak wszystkie te metody trafiają do środowiska wykonawczego. Dzięki za wskazanie 'viewWillAppear' –

11

Od Apple's documentation:

Sposób viewWillLayoutSubviews jest również nazywany po widok jest zmieniany i umieszczone przez jego rodzica.

Biorąc viewWillLayoutSubviews nazywa ilekroć bounds zmiana na widok sterownika, nie ma gwarancji, że będzie ona być wywołana tylko raz. Zostanie wywołane, gdy na przykład pojawi się obrót.

Twoja metoda configureView jest prawdopodobnie lepsza wywoływana z gdzieś indziej, być może w viewWillAppear, viewDidAppear lub nawet zwyczaj mutator dla BirdDetail pozycji jak na Hermann's suggestion.

Powiązane problemy