О методах viewController "viewDidLoad" и "viewWillAppear"

у меня есть вопрос относительно двух упомянутых методов, так как в моих тестах я не проясняю порядок, в котором они называются. Я думал, что, во-первых,viewDidLoad вызывается, когда viewController загружается в первый раз (как указывает имя), и inmediately после метода init. Тогда я думал, что после viewDidLoad возвращает viewWillAppear называется. Если вы отобразите другой viewController, а затем вернетесь к этому, то он должен быть уже загружен и только viewWillAppear будет называемый.

однако при разработке у меня создается впечатление, что при вызовеviewDidLoad и viewWillAppear... Я не смог найти четкое описание этого жизненного цикла в документации Apple, как это на самом деле работает?

спасибо!

5 ответов


Я хотел бы добавить к ответу Калеба: не путайте контроллер вида и вид! Имя viewDidLoad ясно указывает, что метод вызывается после посмотреть была загружена. Это контроллер вида, который выполняет загрузку.

некоторые указатели относительно жизненного цикла представлений и порядка отправки сообщений:

  • не официальный документ Apple, но я нахожу этой схемы действительно полезно, потому что он включает в себя в значительной степени все UIViewController переопределяет жизненный цикл.
  • В разделе управление ресурсами в контроллерах вида из Apple "View Controller Programming Guide" есть блок-схема, которая показывает, как изначально загружаются представления. Это объясняет loadView и viewDidLoad, также в сочетании с раскадровками.
  • раздел отвечая на уведомления, связанные с отображением из "руководства по программированию контроллера вида Apple" объясняется, как реагировать на виды появляются и исчезают (viewWillAppear: et al)
  • если вы планируете реализовать контроллер представления контейнера:ссылка на класс UIViewController имеет хороший обзор того, как сообщения должны быть отправлены ваш подкласс.

я остановлюсь здесь. Вы можете найти больше материала самостоятельно, погуглив для "жизненного цикла uiviewcontroller".


-viewDidLoad вызывается, когда контроллер загружает вид, который не обязательно сразу после инициализации. Контроллеры представлений не загружают свои представления до тех пор, пока они не понадобятся для отображения или по какой-либо другой причине.

-viewWillAppear вызывается непосредственно перед отображением представления. Это будет после -viewDidLoad, но вы не знаете точно, как долго после. -viewWillAppear вызывается при каждом отображении представления;-viewDidLoad будет вызываться только во второй раз, если представление сгрузили в какой-то точка (например,didReceiveMemoryWarning). В наши дни это необычно, но такое случается.

или если viewController установлен в nil, что обычно может произойти, если контроллер вида запускается из навигационного стека, и поэтому в следующий раз он будет доставлен в навигационный стек, он должен вызвать -viewDidLoad снова.


Я думал, что, во-первых, viewDidLoad вызывается, когда viewController загружается в первый раз (как указано в названии) и сразу после метода init

нет. Имя указывает, что контроллер view был загружен (не сам контроллер). Фактически документы утверждают, что этот метод будет вызван после загрузки иерархии представлений в память (либо через loadView или через перо, например).

затем я подумал, что как только viewDidLoad возвращается, viewWillAppear называется

опять же, нет. loadView (и как следствие viewDidLoad) метод будет вызываться в первый раз, что view свойство должно быть доступно и является nil (что имеет место, когда вы инициализируете контроллер). Подумайте об этом простом сценарии:

MyViewController *vc = [[MyViewController alloc] init];
UIView *view = vc.view; // <= loadView & viewDidLoad will fire but it certainly didn't appear...

однако при разработке у меня создается впечатление, что нет порядка при вызове viewDidLoad и viewWillAppear...

Ну есть приказ. Мы точно знаем, что viewWillAppear всегда будет называться после viewDidLoad (если оба они должны быть вызваны, конечно).


Как вы сказали, ViewDidLoad вызывает только один раз после загрузки представления. Таким образом, мы можем инициализировать экземпляры в viewDidLoad. Он в основном предназначен для инициализации.

viewWillAppear будет вызывать всякий раз, когда мы достигаем этой точки зрения. Поэтому, если есть какие-либо изменения в UI, мы можем сделать это в viewWillAppear.


Я запустил трассировку, когда все эти вызовы сделаны:http://thecodist.com/article/ios_arc_storyboards_and_uiviewcontroller_trace