Кроме того, если ваше представление находится в стеке контроллера Nav, но вы (авто) выпустили его там, где его не должно быть, self.navigationController может быть равен нулю. Doh!

г: Создайте новый UIViewController:
- Xcode -> Новый файл ... -> Сенсорный класс Cocoa -> UIViewController
- Имя: MyViewController

2. Шаг: Перетащите «Контроллер навигации» (UINavigationController) из библиотеки в MyViewController.xib.

3.Step: Я уверен, что мне нужно что-то сделать, чтобы правильно подключить навигационный контроллер, не так ли?

4.Step: Попробуйте запустить новый View Controller как модальное диалоговое окно:

MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
NSLog(@"navContr: %@", myViewController.navigationController);
[self.navigationController presentModalViewController: myViewController animated:YES]; 

Результат: "navContr: nil"

5.Step: Вы можете увидеть новое модальное представление (MyViewController), но там нет NavigationController и UINavigationBar.

Спасибо большое за помощь!

ОБНОВЛЕНИЕ 1:

6.Step: Я установил новый UIViewController (ViewNavi2) как «Root View Controller»:

7.Step: Я определяюIBOutlet UINavigationController *navigationController в классе MyViewController и настройте xib: Navigation Controller -> Подключения -> Ссылки на розетки

Но мой навигационный контроллер все еще ноль :-(

MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
NSLog(@"navContr: %@", myViewController.navigationController);
// -> "navContr: nil"
 swiftBoy25 мар. 2013 г., 06:14
Вот это простое руководство для добавления контроллера навигации

Ответы на вопрос(3)

Решение Вопроса

но все, что говорилось в документации Apple, было то, что он «не оптимален» без объяснения того, как это сделать. Я хотел, чтобы мое главное окно с вкладками вызывало модальное окно, содержащее типичные элементы управления навигацией, без программного определения контроллера навигации. Я поделюсь, как я это сделал.

Ваш код был очень похож на мой, так как я также определилIBOutlet UINavigationController *navigationController в MyViewController. В Интерфейсном Разработчике я просто определил свое представление в контроллере корневого представления и установил для представления File Owner-> это определение представления.

И аналогично вашему коду я сделал следующее в родительском окне:

MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
[self presentModalViewController:myViewController animated:YES];

(Я вызываю presentModelViewController на себя, я не знаю, почему у васself.navigationController.) Когда я проверил это, результатом было то, что мое представление было загружено из файла NIB, но панель навигации отсутствовала. Еще одна строка кода в MyViewController исправила это:

- (void)viewDidLoad {
    [super viewDidLoad];

    [self setView:myNavigationController.view];

}

Все, что я здесь делаю, это настраиваю представление MyViewController так, чтобы оно указывало на myNavigationController.view, который содержит все, что было определено в файле NIB, включая контроллер навигации.

 Arpit B Parekh11 июл. 2016 г., 07:46
Очень красивое объяснение. Спасибо.
 Besi28 сент. 2011 г., 09:42
@ Генри Я пытался сделать что-то очень похожее. Это спасло мне много работы. Спасибо!
 Manni17 февр. 2011 г., 10:17
Большое спасибо за ваш отличный ответ! Я уверен, что это поможет многим людям! :-) @all: пожалуйста, проголосуйте
 CyberMew04 мая 2017 г., 06:46
Можете ли вы показать изображение файла XIB? Предполагается ли, что у нас есть один View (который является владельцем представления) и другой UINavigationController на самом верхнем уровне? Тогда куда же пойдут наши реальные объекты пользовательского интерфейса, в представлении UINavigationController или в исходном представлении?

Следующий код не даст вам никакого действительного объекта.

NSLog(@"navContr: %@", myViewController.navigationController);

Причина в том, что свойство navigationController для UIViewControllerвозвращает только контроллер навигации, если контроллер представления находится в его стеке. Это свойство равно nil, если не удается найти контроллер навигации. Ваш контроллер представления не находится в стеке контроллера навигации. В любом случае, я даже не уверен, правильно ли вы инициализировали наш навигационный контроллер. Прочитайте некоторую документацию.

 Manni13 янв. 2011 г., 14:26
Спасибо за вашу помощь тоже! Это говорит о том, что «контроллер представления не находится в его стеке». Да, я думаю, что не правильно инициализировал свой контроллер навигации. Но как я могу сделать это в Интерфейсном Разработчике? Я обновляю свой вопрос, пожалуйста, посмотрите на "ОБНОВЛЕНИЕ 1".
 AndrewS25 июл. 2011 г., 07:14
Кроме того, если ваше представление находится в стеке контроллера Nav, но вы (авто) выпустили его там, где его не должно быть, self.navigationController может быть равен нулю. Doh!

вый проект -> Приложение на основе навигации) Затем откройте MainWindow.xib в Интерфейсном Разработчике. Хотя это не представление, представьте его как контроллер представления, созданный вами на шаге 1. Затем посмотрите на «Root View Controller», на который ссылается инспектор, и посмотрите, как он подключен к перу «Root View Controller» в Инспектор атрибутов и класс RootViewController в Инспекторе удостоверений.

Вы захотите поместить контент, который вы хотите отобразить, в корень вашей навигации в вашей версии «RootViewController». Как правило, контроллер, который отображается рядом, является «DetailViewController». Снова, прочитайте пример кода, который предоставляет шаблон, и вы увидите, как начать с этого. Посмотрите на закомментированный код вdidSelectRowAtIndexPath в примере шаблона RootViewController.m. Вам нужно будет создать свой собственный контроллер представления, который будет служить в качестве DetailViewController.

Надеюсь, это прояснит для вас.

// РЕДАКТИРОВАТЬ на основе вашего комментария //
В документах Apple говорится, что если вы хотите использовать IB для создания своих контроллеров навигации, вы должны поместить их в свой MainWindow.xib. Я возился с тем фактом, что у вас не может быть NavigationController в качестве подпредставления вашего объекта UIView. Что вы можете сделать, учитывая, с чего начали, - это использовать IB, чтобы добавить объект панели навигации в ваш контроллер представления, а затем контролировать вещи оттуда.

Из документации Apple «Хотя вы также можете загружать автономные или модально представленные контроллеры навигации из основного файла пера (или любого другого файла пера), это не является оптимальным. В этих сценариях обычно проще создать контроллер навигации программно при точка использования. "

// БОЛЬШЕ РЕДАКТИРОВАНИЯ // В XCode4 шаблон проекта теперь называется проектом «Master Detail». Это связано с тем, что он будет настроен в качестве контроллера разделенного просмотра в iPad, но все еще будет обычным проектом навигации в iPhone. Там, где я ссылаюсь на «RootViewController» в ответе, теперь вы найдете что-то под названием «MasterViewController»

 Manni13 янв. 2011 г., 14:21
Большое спасибо за помощь! Я тщательно анализирую навигационное приложение. Да, есть MainWindow.xib с работающим навигационным контроллером. Это связано с AppDelegate, это единственное отличие моего MyViewController. В проекте шаблона вы не можете видеть, как инициализируется MainWindow.xib и, возможно, мой код "MyViewController * myViewController = [[MyViewController alloc] initWithNibName: @" MyViewController "bundle: nil];" неправильно. Пожалуйста, посмотрите "ОБНОВЛЕНИЕ 1" в моем вопросе.
 Adam13 янв. 2012 г., 03:09
Apple удалила возможность сделать этот проект из Xcode4 - даже если вам все еще придется делать это для всех проектов iOS 4.0 / 4.1 / 4.2. Было бы полезно, если бы вы могли дать ссылку на пример проекта или объяснить, ЧТО ТОЧНО происходит в этом проекте
 Walter13 янв. 2011 г., 17:35
Из документации Apple «Хотя вы также можете загружать автономные или модально представленные контроллеры навигации из основного файла пера (или любого другого файла пера), это не является оптимальным. В этих сценариях обычно проще создать контроллер навигации программно при точка использования. "
 Walter14 янв. 2011 г., 21:06
В другом вопросе, который вы упоминаете, похоже, что вы заставили работать контроллер представления / контроллера навигации, когда вы помещаете его в MainWindow.xib. Я хотел бы предложить запустить тот, который работает таким образом через изящный nib2objc (github.com/akosma/nib2objc) программное обеспечение. Это должно дать вам несколько объективных C-файлов, которые вы можете посмотреть, чтобы увидеть, как различные элементы создаются и связаны друг с другом.
 Manni14 янв. 2011 г., 12:11
Да, вы правы, было бы проще создать контроллер навигации программно, но я должен сделать это с помощью Interface Builder. Причину вы можете найти здесь:stackoverflow.com/questions/4604647/... У тебя еще есть идеи для меня?

Ваш ответ на вопрос