2013-02-18 2 views
12

У меня есть следующий код в контроллере представления детали:метод вызывается в -viewWillLayoutSubviews необъяснимо работает дважды

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

Когда я непосредственно перейти к этой точке зрения контроллера с точки останова на первой линии -configureView, представляется, что [self configureView] вызывается дважды. Однако:

  • Оба раза метод ударил, стек выглядит следующим образом:

stack

  • Когда я комментирую [self configureView] в приведенном выше коде, он ударил ноль раз.
  • Как видно из того, что стек является одинаковым оба раза, -configureView не называет себя рекурсивно.
  • -configureView вызывается только в вышеуказанном коде.
+0

Так что 'viewWillLayoutSubviews' вызывается дважды? Тогда вопрос заключается в том, что вызывает повторную компоновку в вашем контроллере просмотра? – abellina

+0

Да, хороший момент. Вопрос в том, почему вызов '-viewWillLayoutSubviews' вызывается дважды. Точно так же в стеке. –

ответ

1

Если вы следуете обычным шаблонам, то configureView вызывается в установщике detailItem. Проверьте метод сеттера. И [detailViewController setDetailItem:something] часто называют в prepareForSegue:.

Ключевой момент: это имеет значение?

+1

Я вызываю его в '-viewWillLayoutSubviews', потому что я хочу, чтобы значения обновлялись из модели в любое время, когда выкладывались представления. Вызов его в сеттере имеет более структурный смысл, но приводит к тому, что представления не обновляются до перехода, что приводит к представлению устаревших данных. В любом случае, это, безусловно, имеет значение! Во-первых, я хотел бы понять поведение. Кроме того, что, если бы я хотел интенсивно работать в этом методе? Зачем это нужно выполнять дважды? –

+1

Я не сказал, что вам нужно позвонить ему из сеттера. Я просто хочу дать подсказку, что вы можете называть ее и из сеттера, что может вызвать двойное обращение. Это все. Однако я не уверен, что это подходящее место для обновления данных из модели. viewWillAppear должен быть достаточным для этой цели. –

+0

Спасибо, Германн! Я посмотрю отчет здесь. Я думаю о том, как цитата: «Программисты тратят огромное количество времени на размышления о скорости некритических частей своих программ ...» от Кнута (http://c2.com/cgi/wiki?PrematureOptimization) ,Я просто пытаюсь понять, как все эти методы подключаются к среде выполнения. Спасибо, что указали «viewWillAppear» –

11

От Apple's documentation:

Метод viewWillLayoutSubviews также называют после того, как представление изменяет размер и расположение его родителя.

Учитывая viewWillLayoutSubviews вызываются всякий раз, когда bounds изменения на просмотре контроллера, нет никакой гарантии, что он будет вызван только один раз. Он будет вызываться всякий раз, когда происходит поворот.

Ваш метод configureView, вероятно, лучше называть где-то еще, возможно, в viewWillAppear, viewDidAppear или даже обычай мутатор для BirdDetail элемента согласно Hermann's suggestion.

Смежные вопросы