Подтвердить что ты не робот

Почему self.navigationController null в viewDidLoad?

Я знаю, что есть много похожих вопросов, но я не могу найти тот, который специально решает это.

Почему self.navigationController null при вызове в viewDidLoad, но корректно, если вызывается извне viewDidLoad?

Это мой вывод из NSLog(@"%@",self.navigationController); Первый вызван в viewDidLoad, второй я добавляю кнопку к интерфейсу с помощью метода, который вызывает NSLog(@"%@",self.navigationController);:

NavApp[31524:11003] (null)
NavApp[31524:11003] <UINavigationController: 0x6e21190>

Я знаю, что должно быть какое-то простое объяснение этого поведения, мне просто интересно, что это такое. Спасибо!

4b9b3361

Ответ 1

Вид контроллера просмотра загружается при первом доступе к методу/свойства -view на этом контроллере. После загрузки представления вызывается метод viewDidLoad. Это довольно прямолинейно. Вы также должны помнить, что просмотр можно загружать/выгружать несколько раз, если предупреждения о памяти принимаются, когда представление отключено.

Итак, viewDidLoad не означает, что ваш контроллер просмотра был вставлен в контроллер навигации. В процессе нажатия контроллера вида на контроллер навигации его view будет доступен и загружен, но это произойдет до завершения всего нажатия. Таким образом, viewDidLoad явно получает вызов до того, как свойство navigationController было обновлено.

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

Итак, viewDidLoad - это неправильное место, чтобы делать то, что вы делаете. Вероятно, вы захотите использовать такой метод, как viewDidAppear:, чтобы вы знали, что представление контроллера просмотра является частью иерархии представлений при его вызове.