viewDidAppear вызывается ДО того, как он действительно появится?

Я знаю, что этот вопрос похож на это, но я уже знаю об обходном пути. Это больше вопрос анализа.

Приведенная выше ссылка - это вопрос, специфичный для UITabBarController, но я также наблюдал поведение с UINavigationController, когда я pushViewController:... animated:NO, т.е. нет анимации.

Итак, мой вопрос: ПОЧЕМУ представление появляется ПОСЛЕ метода viewDidAppear, в то время как само его название подразумевает, и определение говорит, что представление уже появилось (определение говорит, что представление было добавлено в окно).

Я отметил точку останова в методе, чтобы увидеть стек вызовов, и вот журнал для нажатия на UINavigationController:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidApear:animated];
    NSLog("...");              // <<<<<Breakpoint here
}

Вот журнал:

(gdb) next
Single stepping until exit from function -[UINavigationController navigationTransitionView:didEndTransition:fromView:toView:], which has no line number information.
(gdb) next
Single stepping until exit from function -[UINavigationTransitionView _notifyDelegateTransitionDidStopWithContext:], which has no line number information.
(gdb) next
Single stepping until exit from function -[UINavigationTransitionView _navigationTransitionDidStop], which has no line number information.
(gdb) next
Single stepping until exit from function -[UIViewAnimationState sendDelegateAnimationDidStop:finished:], which has no line number information.
(gdb) next
Single stepping until exit from function +[UIViewAnimationState popAnimationState], which has no line number information.
(gdb) next
Single stepping until exit from function dyld_stub_objc_msgSend, which has no line number information.
(gdb) next
Single stepping until exit from function objc_msgSend, which has no line number information.
(gdb) next
Single stepping until exit from function -[NSObject(NSObject) release], which has no line number information.
(gdb) next
Single stepping until exit from function dyld_stub_objc_msgSend, which has no line number information.
(gdb) next
Single stepping until exit from function objc_msgSend, which has no line number information.
(gdb) next
Single stepping until exit from function -[UIViewAnimationState dealloc], which has no line number information.
(gdb) next
Single stepping until exit from function -[UINavigationTransitionView transition:fromView:toView:], which has no line number information.
(gdb) next
Single stepping until exit from function -[UINavigationTransitionView transition:toView:], which has no line number information.
(gdb) next
Single stepping until exit from function -[UINavigationController _startDeferredTransitionIfNeeded], which has no line number information.
(gdb) next
Single stepping until exit from function -[UILayoutContainerView layoutSubviews], which has no line number information.
(gdb) next
Single stepping until exit from function -[CALayer layoutSublayers], which has no line number information.
(gdb) next
Single stepping until exit from function dyld_stub_objc_msgSend, which has no line number information.
(gdb) next
Single stepping until exit from function objc_msgSend, which has no line number information.
(gdb) next
Single stepping until exit from function -[NSObject(NSObject) release], which has no line number information.
(gdb) next
Single stepping until exit from function CALayerLayoutIfNeeded, which has no line number information.

person Sailesh    schedule 14.06.2011    source источник


Ответы (1)


Я нашел следующее:

  • ViewWillAppear: обычно я использую ViewWillAppear только для обновления данных в форме. Итак, для приведенного выше примера я бы использовал это, чтобы фактически загрузить данные из моего домена в форму. Создание UIViews довольно затратно, и вам следует по возможности избегать этого в методе ViewWillAppear, потому что когда это вызывается, это означает, что iPhone уже готов показать UIView пользователю, и все, что вы делаете здесь повлияет на производительность очень заметным образом (например, задержка анимации и т. д.).

  • ViewDidAppear: наконец, я использую ViewDidAppear, чтобы запускать новые потоки для вещей, выполнение которых займет много времени, например, выполнение вызова веб-службы для получения дополнительных данных для формы выше. Хорошо, что представление уже существует. и отображается пользователю, вы можете показать пользователю приятное сообщение «Ожидание», пока вы получаете данные

Украдено из SO-вопроса: В чем разница между -viewWillAppear: и -viewDidAppear:?

person Joetjah    schedule 14.06.2011
comment
Спасибо за ответ, Joetjah, но как это относится к моему вопросу? - person Sailesh; 14.06.2011
comment
Представление отображается сразу после viewDidAppear, но содержимое еще не загружено на экран. Согласно другим сообщениям, вы можете думать, что viewDidAppear является загрузчиком действий, определенных в viewDidAppear, в то время как представление выводится. Другими словами, вещи, которые не должны быть показаны при появлении, но должны быть рассчитаны с самого начала. Представьте, что по какой-то причине вы решили, что представление должно появляться через анимацию длительностью 3 секунды. Это было бы 3 секунды «отходов», но вместо этого вы можете тем временем загружать вещи через viewDidAppear. - person Joetjah; 14.06.2011