2016-05-10 7 views
0

Я пытаюсь понять жизненный цикл контроллера контроллера, и я прочитал несколько противоречивых утверждений о awakeFromNib. Документы говорят, что все выходы должны быть установлены в awakeFromNib, но I see that it's not always true. Каков порядок звонков между awakeFromNib, prepareForSegue и когда станут доступны розетки?awakeFromNib vs Outlets - устанавливают ли выходы и segues, когда мы вызываем awakeFromNib

+0

Чаще всего используется 'awakeFromNib' в жизненном цикле UIView. Но порядок, который вы ищете, - это 'prepareForSegue',' awakeFromNib', 'viewDidLoad'. Вы можете получить доступ к выходам в awakeFromNib, но вы должны прочитать предостережение, которое вам нужно, чтобы сначала попытаться получить доступ к виду вашего контроллера. Так назывался «взлом» плаката другого вопроса. Безопаснее и стандартизовать контроллер просмотра, созданный в 'viewDidLoad'. – beyowulf

+0

Спасибо! Поэтому, если нам нужны полностью инициализированные представления и выходы, мы начинаем awakeFromNib с [self view] –

+0

Это цель-c. Быстро, вы можете сказать что-то вроде 'print (self.view)', что несколько бессмысленно, и именно поэтому я рекомендую использовать 'viewDidLoad'. – beyowulf

ответ

0

Контроллер вашего представления и его иерархия представлений загружаются из отдельных файлов nib во время выполнения. Выходы в иерархию представлений не подключены до тех пор, пока не будет загружена иерархия представления, которая будет выполняться после загрузки контроллера представления. (Я объяснил это более подробно in this answer.)

Допустим, у вас есть «главный» контроллер вида в навигационном контроллере. Контроллер главного представления выполняет последовательность, чтобы нажимать «подробный» контроллер вида. Вот список событий:

  1. Детальный контроллер просмотра загружен из его наконечника. Если сценарий раскадровки содержит другие объекты верхнего уровня, они также загружаются.

  2. Контроллер подробного представления получает awakeFromNib: дополнительные контроллеры контроллера доступа к другим объектам верхнего уровня в сцене подключены, но выходы к иерархии представлений не являются.

  3. Контроллер главного вида получает prepareForSegue с шагом, указывающим на контроллер подробного представления.

  4. Segue просит контроллер навигации нажать подробно контроллер.

  5. Контроллер навигации запрашивает контроллер подробного представления для его просмотра, чтобы добавить в иерархию представления контроллера навигации.

  6. Контроллер детального представления загружает свою иерархию представлений. Это подключает выходы контроллера детали к своей иерархии представлений.

  7. Все объекты в иерархии вида получают awakeFromNib.

  8. Подробный контроллер просмотра получает viewDidLoad.