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

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

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

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

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

IBOutlet NavigationController *navController; 

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

Почему не создается мой navController? Любые идеи? Я думаю, что мне что-то не хватает в том, как работает initWithNibName ..

Спасибо.


person devinkb    schedule 16.12.2009    source источник


Ответы (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:, который может вызвать автоматическое сохранение объекта в розетке.) Подробную информацию о процессе загрузки пера см. В Руководстве по программированию ресурсов.

person eonil    schedule 24.01.2010

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

person ennuikiller    schedule 16.12.2009
comment
В Руководстве по программированию ресурсов есть дополнительная информация о жизненном цикле файлов пера: developer.apple.com/iPhone/library/documentation/Cocoa/ - person Brad Larson; 16.12.2009

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

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

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

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

РЕДАКТИРОВАТЬ:
См.: UINavigationController * UIViewController :: navigationController ()
См .: UINavigationItem * UIViewController :: navigationItem ()

person Michael Aaron Safyan    schedule 16.12.2009