Как добавить навигационный контроллер с помощью Interface Builder?
1. Шаг: создайте новый UIViewController:
- Xcode - > Новый Файл... - >Какао Сенсорный Класс - > UIViewController
- Имя: MyViewController
2. Шаг: перетащите "навигационный контроллер" (UINavigationController) из библиотеки в MyViewController.xib
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":
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 возвращает навигационный контроллер, только если контроллер вида находится в стеке. Это свойство равно нулю, если не удается найти навигационный контроллер. контроллер вида не находится в стеке навигационного контроллера. Во всяком случае, я даже не уверен, правильно ли вы инициализируете наш навигационный контроллер. Читать некоторые документация.