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

Вызов viewDidLoad перед init?

У меня странная ситуация. В моем контроллере viewDidLoad вызывается до init. Есть ли какая-то техническая причина?

4b9b3361

Ответ 1

Метод viewDidLoad вызывается при доступе к self.view внутри метода init (поскольку self.view еще не загружается из nib, процесс, похоже, затягивается, чтобы он не возвращал nil).

Ответ 2

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

Хорошо, я был в той же ситуации. Я думал, что viewDidLoad вызывается до метода init в моем классе контроллера вида. Но то, что на самом деле происходит, не так: поток начинается с метода init, но при вызове [super init *] происходит переход к viewDidLoad, поэтому мои сообщения журнала в методе viewDidLoad отображались сначала, как те, что были в моей пользовательской инициализации.

Я думаю, что это так. Я надеюсь, что это сэкономит время кому-то.

[Извините за мой английский]

Ответ 3

Когда вы инициализируете код UIViewController из кода, вы используете -initWithNibName:bundle:, тогда как когда он инициализируется из XIB, код загрузки XIB вызывает -initWithCoder:. Один, и только один из этих двух методов будет вызван, и они обязательно будут вызваны до -viewDidLoad.

Нет мыслимого способа, с помощью которого -viewDidLoad можно было бы назвать первым, если вы не вызываете его самостоятельно (чего вы никогда не должны делать).

Ответ 4

Я не знаю, для чего это вызвало это viewController, но я столкнулся с аналогичным случаем с UITabBarController. Я думал, что это может помочь другому человеку, с которым он сталкивается с UITabBarController.
Поскольку я знаю, что все viewControllers вызывают init перед viewDidLoad, за исключением UITabBarController и его подклассов.
Поскольку Andrew утверждает здесь, UITabBarControllers вызывает loadView внутри метода [super init], что вызывает вызов viewDidLoad. Таким образом, метод viewDidLoad будет вызван до завершения init.
Если у вас есть что-то для настройки в viewDidLoad, вы, возможно, должны сделать это внутри метода init после вызова [super init].

Ответ 5

Нет, сообщение viewDidLoad всегда вызывается после init.

Вы уверены, что init вызывается вообще? Существует несколько методов init, особенно для UIViewController, может быть, другой вызван вместо того, чтобы вы думали иначе.

Если вам нужна дополнительная информация, вставьте код viewDidLoad и все ваши методы init, а также сообщите нам, как он загружен (например, с кодом) или из низа.

Ответ 6

Если ваш ViewController загружается из основного файла nib, то, скорее всего, это initWithCoder, который вызывается для инициализации контроллера.