2013-06-28 2 views
6

У меня вопрос относительно двух упомянутых методов, так как в моих тестах я не разъясняю порядок их вызова. Я подумал, что, во-первых, viewDidLoad вызывается, когда viewController загружается в первый раз (как указывает имя) и сразу же после метода init. Затем я подумал, что как только viewDidLoad вернется, вызывается viewWillAppear. Если вы выведете другой viewController, а затем вернетесь к этому, тогда он должен быть уже загружен и будет вызываться только viewWillAppear.О viewController's "viewDidLoad" и "viewWillAppear" методы

Однако при разработке я создаю впечатление, что при звонках viewDidLoad10 и viewWillAppear ... я не смог найти четкое описание этого жизненного цикла, как это работает?

Спасибо!

+1

«viewDidLoad вызывается, когда ViewController загружается в первый раз (как следует из названия)» - это смущало меня в течение длительного времени тоже. Контроллер представления и его вид - это разные вещи. Это одна из самых важных (и фундаментальных) вещей, которые вы должны понимать о контроллерах представлений. –

ответ

19

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

Некоторые указатели, касающиеся жизненного цикла взглядов и порядок, в котором посылаются сообщения:

  • Не официальный документ компании Apple, но я считаю this diagram очень полезным, потому что она включает в себя почти все из жизненного цикла переопределениях UIViewController «s ,
  • В разделе Resource Management in View Controllers из «Руководства по программированию контроллера« Apple »имеется блок-схема, изображающая загрузку представлений. Он объясняет loadView и viewDidLoad, также в сочетании с раскадровки.
  • Раздел Responding to Display-Related Notifications от «View Controller Programming Guide» от Apple объясняет, как реагировать на взгляды появляющихся и исчезающих (viewWillAppear: и др)
  • Если вы планируете реализации контроллер представления контейнера: UIViewController class reference имеет хороший обзор того, как сообщения должны быть отправлены вашим подклассом.

Я останавливаюсь здесь. Вы можете найти больше вещей сами по googling для «жизненного цикла uiviewcontroller».

+2

Это [Жизненный цикл UIViewController] (http://rdkw.wordpress.com/2013/02/24/ios-uiviewcontroller-lifecycle/) превосходно. Спасибо за ссылку. –

+0

Стоит отметить, что viewWillUnload устарел в iOS 6 («представления больше не очищаются в условиях низкой памяти и поэтому этот метод никогда не вызывается»). Нижняя левая часть диаграммы жизненного цикла не относится к современным приложениям iOS. Остальная часть диаграммы очень полезна, хотя, спасибо! –

9

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

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

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

+0

, все ваши розетки, которые вы, возможно, настроили в Interface Builder, подключены, когда вызывается 'viewDidLoad'. – fguchelaar

+0

Спасибо! Ответ, который я принял, также ссылается на этот код – AppsDev

1

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

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

3

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

No. Название указывает на то, что был загружен контроллер 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 (если оба они должны быть вызваны, конечно).

+0

Итак, дело в том, что существует порядок, если вызываются оба метода, но 'viewDidLoad' не обязательно должен возвращаться до вызова' viewWillAppear'? – AppsDev

+0

Дело в том, что методы не «связаны» каким-либо образом. 'viewDidLoad' - это загрузка иерархии в память, в то время как' viewWillAppear' вызывается, когда представление собирается добавить в иерархию (для представления).'viewDidLoad' _always_ возвращается до' viewWillAppear'. – Alladinian

+0

Хорошо, спасибо за разъяснение – AppsDev