О методах 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