2013-02-18 19 views
12

Ho il seguente codice in un controller di vista di dettaglio:Metodo chiamato -viewWillLayoutSubviews corre inspiegabilmente due volte

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

Quando ho Segue a questo controller di vista con un punto di interruzione sulla prima linea della -configureView, sembra che [self configureView] viene chiamato due volte. Tuttavia:

  • Entrambe le volte il metodo è colpito, lo stack aspetto:

stack

  • Quando io commento [self configureView] nel codice di cui sopra, è colpito zero volte.
  • Come evidente dal fatto che la pila è uguale in entrambe le volte, -configureView non si chiama in modo ricorsivo.
  • -configureView viene chiamato solo nel codice precedente.
+0

Quindi 'viewWillLayoutSubviews' viene chiamato due volte? Quindi la domanda è: cosa sta provocando un re-layout nel tuo controller di visualizzazione, giusto? – abellina

+0

Sì, buon punto. La domanda è: perché viene chiamata '-viewWillLayoutSubviews' due volte. Nello stesso identico modo in pila. –

risposta

1

Se si seguono i soliti schemi, configureView viene chiamato nel setter di detailItem. Controllare il metodo setter. E [detailViewController setDetailItem:something] viene spesso chiamato in prepareForSegue:.

Il punto chiave è: è importante?

+1

Lo chiamo in '-viewWillLayoutSubviews' perché voglio che i valori si aggiornino dal modello ogni volta che vengono visualizzate le viste. Chiamarlo nel setter ha un senso più strutturale, ma porta a non aggiornare le viste prima di un passaggio, portando alla presentazione di dati obsoleti. Comunque sì, sembra sicuramente importante! Per prima cosa, mi piacerebbe capire il comportamento. Inoltre, cosa succede se volessi un'operazione intensiva con questo metodo? Perché dovrebbe essere eseguito due volte? –

+1

Non ho detto che devi chiamarlo dal setter. Voglio solo dare il suggerimento che potresti anche chiamarlo dal setter che potrebbe essere chiamato due volte. È tutto. Tuttavia, non sono convinto che questo sia un luogo appropriato per aggiornare i dati dal modello. viewWillAppear dovrebbe essere sufficiente a tale scopo. –

+0

Grazie Hermann! Darò un'occhiata a un rapporto qui. Sto pensando a come la citazione, "I programmatori sprecano un'enorme quantità di tempo a pensare o preoccuparsi della velocità delle parti non critiche dei loro programmi ..." di Knuth (http://c2.com/cgi/wiki?PrematureOptimization) .Sto solo cercando di capire come tutti questi metodi si collegano al runtime. Grazie per aver segnalato 'viewWillAppear' –

11

Da Apple's documentation:

Procedimento viewWillLayoutSubviews è chiamato anche dopo la visualizzazione viene ridimensionato e posizionato dal suo genitore.

Dato viewWillLayoutSubviews è chiamato ogni volta che il cambiamento bounds sulla vista del controllore, non c'è alcuna garanzia che sarà invocato una sola volta. Ad esempio, verrà chiamato ogni volta che si verifica una rotazione.

Il tuo metodo configureView è probabilmente meglio chiamato da qualche altra parte, magari in viewWillAppear, viewDidAppear o anche un mutatore personalizzato per BirdDetail voce secondo Hermann's suggestion.

Problemi correlati