awakeFromNib не вызывает, а отображает xib

Я создал новый проект в xcode 4.5 и назвал свой viewcontroller

-(ID) initWithNibName: сверток:

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

По яблочной документации для -(void)awakeFromNib "Готовит получателя к обслуживанию после того, как он был загружен из архива Интерфейсного Разработчика или файла пера"."Объекты, которые соответствуют NSCoding Протокол (включая все подклассы UIView и UIViewController) инициализируется с использованием их метода initWithCoder:. Все объекты, которые не соответствуют протоколу NSCoding, инициализируются с использованием их метода init. После того, как все объекты были созданы и инициализированы, код загрузки пера восстанавливает соединения розеток и действий для всех этих объектов. Затем он вызывает метод объектов awakeFromNib."

Мой вопрос заключается в том, почему awakeFromNib не вызывает при загрузке файла XIB? Я делаю что-то не так? Пожалуйста, опишите подробно

2 ответа

Решение

awakeFromNib: вызывается, только если контроллер представления находится внутри файла nib.
В этом случае вы инициализируете контроллер представления с помощью init initWithNibName: bundle, поэтому содержимое контроллера представления находится внутри кончика, а не самого контроллера представления.
Если вы откроете файл xib, перетащите объект внутрь xib и зададите в качестве класса имя класса вашего контроллера представления, тогда будет вызван awakeFromNib (в этом случае вам не нужно инициализировать вручную контроллер представления).
Так что имейте в виду разницу между наличием контроллера представления в xib-файле и наличием контроллера представления не в xib-файле, а со всем его содержимым, загруженным из xib-файла.

PS: я использовал nib и xib взаимозаменяемо.

РЕДАКТИРОВАТЬ
Я забыл рассказать вам, как обойти это. Переопределите viewDidLoad, чтобы делать вещи с инициализированными выходами.

Почему бы просто не добавить -(id)initWithNibName:bundle: метод к вашему подклассу вместо -(void)awakeFromNib?

Мои методы "awakeFromNib" вызываются просто отлично, но я загружаю свой контроллер вида:

myViewController *vc = [[[NSBundle mainBundle] loadNibNamed:@"myViewController" owner:self options:nil] objectAtIndex:0];

так что мне интересно, если ваш awakeFromNib не вызывается, потому что вы используете вместо него initWithNibName?

РЕДАКТИРОВАТЬ: Я только что видел ваш комментарий, что вы добавляете awakeFromNib в ViewController проекта по умолчанию, который создается XCode. Вы сняли флажок "использовать StoryBoard" при создании проекта? Если ваше перо находится внутри основной раскадровки проекта, возможно, вам придется прыгнуть через несколько дополнительных обручей.

Другие вопросы по тегам