Я пытаюсь понять жизненный цикл контроллера контроллера, и я прочитал несколько противоречивых утверждений о awakeFromNib
. Документы говорят, что все выходы должны быть установлены в awakeFromNib
, но I see that it's not always true. Каков порядок звонков между awakeFromNib
, prepareForSegue
и когда станут доступны розетки?awakeFromNib vs Outlets - устанавливают ли выходы и segues, когда мы вызываем awakeFromNib
ответ
Контроллер вашего представления и его иерархия представлений загружаются из отдельных файлов nib во время выполнения. Выходы в иерархию представлений не подключены до тех пор, пока не будет загружена иерархия представления, которая будет выполняться после загрузки контроллера представления. (Я объяснил это более подробно in this answer.)
Допустим, у вас есть «главный» контроллер вида в навигационном контроллере. Контроллер главного представления выполняет последовательность, чтобы нажимать «подробный» контроллер вида. Вот список событий:
Детальный контроллер просмотра загружен из его наконечника. Если сценарий раскадровки содержит другие объекты верхнего уровня, они также загружаются.
Контроллер подробного представления получает
awakeFromNib
: дополнительные контроллеры контроллера доступа к другим объектам верхнего уровня в сцене подключены, но выходы к иерархии представлений не являются.Контроллер главного вида получает
prepareForSegue
с шагом, указывающим на контроллер подробного представления.Segue просит контроллер навигации нажать подробно контроллер.
Контроллер навигации запрашивает контроллер подробного представления для его просмотра, чтобы добавить в иерархию представления контроллера навигации.
Контроллер детального представления загружает свою иерархию представлений. Это подключает выходы контроллера детали к своей иерархии представлений.
Все объекты в иерархии вида получают
awakeFromNib
.Подробный контроллер просмотра получает
viewDidLoad
.
Чаще всего используется 'awakeFromNib' в жизненном цикле UIView. Но порядок, который вы ищете, - это 'prepareForSegue',' awakeFromNib', 'viewDidLoad'. Вы можете получить доступ к выходам в awakeFromNib, но вы должны прочитать предостережение, которое вам нужно, чтобы сначала попытаться получить доступ к виду вашего контроллера. Так назывался «взлом» плаката другого вопроса. Безопаснее и стандартизовать контроллер просмотра, созданный в 'viewDidLoad'. – beyowulf
Спасибо! Поэтому, если нам нужны полностью инициализированные представления и выходы, мы начинаем awakeFromNib с [self view] –
Это цель-c. Быстро, вы можете сказать что-то вроде 'print (self.view)', что несколько бессмысленно, и именно поэтому я рекомендую использовать 'viewDidLoad'. – beyowulf