viewDidLoad вызывает перед init? - PullRequest
20 голосов
/ 02 июля 2010

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

Ответы [ 6 ]

48 голосов
/ 27 апреля 2011

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

14 голосов
/ 23 апреля 2011

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

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

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

6 голосов
/ 24 апреля 2016

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

3 голосов
/ 05 февраля 2011

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

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

0 голосов
/ 05 февраля 2011

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

0 голосов
/ 02 июля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...