вызов initWithNibName не инициализирует элементы в nib, он имеет 0x0 - PullRequest
9 голосов
/ 16 декабря 2009

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

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

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

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

IBOutlet NavigationController *navController; 

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

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

Спасибо.

Ответы [ 4 ]

21 голосов
/ 24 января 2010

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

8 голосов
/ 16 декабря 2009

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

2 голосов
/ 04 июня 2013

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

PhotoShow* obj = [[PhotoShow alloc] init];
[[NSBundle mainBundle] loadNibNamed:@"PhotoShow" owner:obj options:nil];
1 голос
/ 16 декабря 2009

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

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

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

...