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

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

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

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

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

IBOutlet NavigationController *navController; 

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

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

Спасибо.

9
задан devinkb 16 December 2009 в 03:28
поделиться

3 ответа

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

8
ответ дан 4 December 2019 в 07:04
поделиться

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

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

EDIT:
См .: UINavigationController * UIViewController :: navigationController ()
См .: UINavigationItem * UIViewController :: navigationItem ()

1
ответ дан 4 December 2019 в 07:04
поделиться

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

21
ответ дан 4 December 2019 в 07:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: