Вызов initWithNibName не инициализирует элементы в nib, он имеет 0x0

Когда я звоню:

self.viewController = [[DidItViewController alloc] initWithNibName:@"DidItViewController" bundle:nil];

и затем я проверяю self.viewController.navController сразу после выполнения этой строки в отладчике, я обнаруживаю, что она пуста (0x0).

На DidItViewController мой navController определен как:

IBOutlet NavigationController *navController; 

и в моем файле пера у меня есть NavigationController, связанный с этим свойством navController в Владельце файла (DidItViewController).

Почему мой navController не создается? Есть идеи? Я думаю, что я могу упустить что-то о том, как работает initWithNibName..

Благодарю.

4 ответа

Или вы можете использовать [NSBundle loadNibNamed:owner:options:] метод вместо. Этот метод обеспечивает подключение всех выходных соединений. (который [UIViewController initWithNibName: bundle:] не делает)

Образец кода

В этом случае владельцем файла в NIB является внешний экземпляр класса PhotoShow.

// This works completely. All outlets works.
PhotoShow* obj = [[PhotoShow alloc] init];
[[NSBundle mainBundle] loadNibNamed:@"PhotoShow" owner:obj options:nil];
// Outlets are always available at this moment.

// This works. but does not connects outlets correctly sometimes.
PhooShow* obj = [[PhotoShow alloc] initWithNibName:@"PhotoShow" bundle:[NSBundle mainBundle]];
// Outlets may not available at this moment.

Выбор из справочного документа

Вы можете использовать этот метод для загрузки пользовательских интерфейсов и сделать объекты доступными для вашего кода. В процессе загрузки этот метод разархивирует каждый объект, инициализирует его, устанавливает его свойства в соответствии с их настроенными значениями и восстанавливает любые соединения с другими объектами. (Для установления подключений к розетке этот метод использует метод setValue:forKey:, который может привести к автоматическому сохранению объекта в розетке.) Для получения подробной информации о процессе загрузки пера см. Руководство по программированию ресурсов.

Xib может занять некоторое время для загрузки всех компонентов. Только после viewDidLoad вы можете быть уверены, что navController инициализирован

Метод viewDidLoad может не вызываться при использовании этого метода.

PhotoShow* obj = [[PhotoShow alloc] init];
[[NSBundle mainBundle] loadNibNamed:@"PhotoShow" owner:obj options:nil];

Вы не должны определять свойство navController; все UIViewController имеют свойства "navigationController" и "navigationItem", которые уже определены автоматически. Они будут указывать на контроллер навигации и элемент навигации соответственно, предполагая, что представление находится в стеке контроллера навигации.

Однако, как было сказано ранее, на свойство "navigationController" нельзя полагаться до тех пор, пока не будет вызвана функция viewDidLoad. Вы должны переопределить ваш метод "viewDidLoad" в "DidItViewController", чтобы выполнять любые манипуляции, которые вы намереваетесь делать с контроллером навигации.

РЕДАКТИРОВАТЬ:
Смотрите: UINavigationController * UIViewController:: navigationController ()
Смотрите: UINavigationItem * UIViewController:: navigationItem ()

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