Переместил мой viewController под NavController и теперь awakeFromNib и initWithCoder не запускаются? - PullRequest
1 голос
/ 22 июля 2009

У меня есть несколько сложное представление, которое я собрал в отдельный проект (шаблон на основе представления) (View Controller был представлен оранжевым значком в MainWindow.xib). Уже достаточно далеко, и я решил перенести его в другой проект, где он будет управляться навигационным контроллером. Он вызывается из довольно простого UINavigationController pushViewController: animated: метод.

MyViewController имеет соответствующий nib-файл (возможно, некоторые из моих заблуждений заключаются в том, что класс & nib почти одинаково назван, с разными суффиксами .m, .h, & .xib) . Когда это было начальное представление при запуске в начальном проекте, при создании его экземпляра вызывались бы и awakeFromNib и initWithCoder . Теперь только viewDidLoad , кажется, вызывается.

Я запутался в том, что / почему такая разница?!? Я нашел некоторые другие темы на S.O. которые связаны, но они все еще оставляют меня почесывать голову с ответами вроде: "awakeFromNib вызывается, когда сам контроллер разархивируется из пера. viewDidLoad вызывается, когда представление создается / разархивируется. Это различие особенно важно, когда представление контроллера хранится в отдельном файле пера. "

Различие, по-видимому, зависит от того, что именно разархивируется в представлении или ViewController. Так что, если ViewController создается и выдвигается, тогда я должен только ожидать, что будет вызван viewDidLoad? и с другой стороны, если мой ViewController имеет IBOutlet (и объектный объектный объект, представляющий его, который был перетащен в мое перо), то я могу ожидать, что initWithCoder и awakeFromNib будут вызваны оба?

Может кто-нибудь помочь мне разобраться? Похоже, что более трудно повторно использовать эти представления / контроллеры, если различные методы произвольно вызываются в очень специфических обстоятельствах ... или, как, конечно, имеет место, это именно , почему они вызываются, скорее, очень специфические обстоятельства ... я просто еще не до конца понимаю разграничение между различными методами.

Кто-нибудь хочет помочь мне разобраться?

1 Ответ

2 голосов
/ 22 июля 2009

Различие кажется зависимым на что, собственно, разархивируется View или ViewController. Так что если ViewController в настоящее время конкретизировать и толкнул, то я должен только ожидать, что viewDidLoad будет вызываться? а с другой стороны, если мой ViewController имеет IBOutlet (и объект VC объект, представляющий это, что был перетащен в мое перо), то я можно ожидать initWithCoder и awakeFromNib, чтобы оба вызывались?

Это то место, куда ты сбиваешься. Дело не в том, есть ли у ViewController IBOutlet. От того, вызван ли -awakeFromNIB.

, определяется, создан ли ViewController в NIB.

Из вашего описания я беру где-то в вашем коде у вас что-то вроде этого:

MyViewController *vc = [[MyViewController alloc] init]; // (or initWithNibName:bundle:)
[navController pushViewController:vc animated:YES];
[vc release];

Если это так, то NIB не создает экземпляр MyViewController. Ваш код Так что -awakeFromNib не будет называться. Вы не проснулись от СИБ.

Что вы, возможно, намеревались сделать, это развернуть Navigation Controller в вашей NIB (переключитесь на просмотр списка; среднюю кнопку в наборе кнопок режима просмотра в левом верхнем углу). Там вы увидите корневой View Controller. По умолчанию это UIViewController. Если вы хотите, чтобы корневым контроллером был MyViewController, вы должны изменить его класс. В этом случае вы получите вызов -awakeFromNib, потому что именно NIB создал этот объект. Затем вы, конечно, должны избавиться от любого кода, который его создает, и поместить его в NavController.

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