Как добавить навигационный контроллер с помощью Interface Builder?

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

2. Шаг: перетащите "навигационный контроллер" (UINavigationController) из библиотеки в MyViewController.xib

alt text

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

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

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

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

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

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


обновление 1:

6.Шаг: я установил новый UIViewController (ViewNavi2) как "Root View Controller":
alt text

7.Шаг: Я определяю IBOutlet UINavigationController *navigationController в классе MyViewController и настройте xib: навигационный контроллер - > соединения - > ссылки на розетки

но мой навигационный контроллер по-прежнему равен нулю : - (

MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
NSLog(@"navContr: %@", myViewController.navigationController);
// -> "navContr: nil"

3 ответов


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

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

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

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.представление, содержащее все, что было определено в файле NIB, включая навигационный контроллер.


посмотрите на шаблон в XCode для "навигационного приложения". (Новый проект - > навигационное приложение) затем откройте главное окно.xib в интерфейсе строителя. Хотя это не представление, подумайте об этом как о viewcontroller, который вы создали на шаге 1. Затем посмотрите на "контроллер корневого представления", на который ссылается инспектор, и посмотрите, как он связан с наконечником" контроллер корневого представления "в инспекторе атрибутов и классе "RootViewController" в идентификаторе инспектор.

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

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

/ / редактирование на основе вашего комментария//
В документах Apple говорится, что если вы хотите использовать IB для создания навигационных контроллеров, вы должны поместить их в свое главное окно.xib. Я возился с тем фактом, что вы не можете иметь NavigationController в качестве подвида вашего объекта UIView. Что вы можете сделать, учитывая, откуда вы начали, - это использовать IB для добавления объекта панели навигации в представление контроллер, а затем контролировать вещи оттуда.

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

//ИЗМЕНЕНИЯ// В XCode4 шаблон проекта теперь называется проектом" Master Detail". Это потому, что это будет настроен как контроллер split view в iPad, но все же обычный навигационный проект в iPhone. Где я ссылаюсь на " RootViewController "в ответе, теперь вы найдете что-то под названием"MasterViewController"


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

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

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