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

1. Шаг: Создайте новый UIViewController:
- Xcode → Новый файл... → Cocoa Touch Class → UIViewController
- Имя: MyViewController

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

alt text

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

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

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":
alt text

7.Step: Я определяю IBOutlet UINavigationController *navigationController в классе MyViewController и настраиваю xib: Navigation Controller → Connections → Referuting Outlets

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

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

Ответ 1

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

Ваш код был очень похож на мой, так как я также определил IBOutlet UINavigationController *navigationController в MyViewController. Из интерфейса Builder я просто определил свой вид в корневом представлении и установил представление 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, включая навигационный контроллер.

Ответ 2

Посмотрите на шаблон в XCode для "Навигационного приложения". (Новый проект → Навигационное приложение). Затем откройте MainWindow.xib в Interface Builder. Хотя это не мнение, подумайте об этом как о контроле над просмотром, который вы создали на шаге 1. Затем посмотрите на "Root View Controller", на который ссылается инспектор, и посмотрите, как он подключен к контроллеру "Root View Controller" в Инспектор атрибутов и класс "RootViewController" в инспекторе идентификации.

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

Надеюсь, это поможет вам разобраться.

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

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

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

Ответ 3

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

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

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