Как добавить контроллер навигации с помощью Interface Builder? - PullRequest
13 голосов
/ 12 января 2011

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

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

alt text

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

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

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

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

Ответы [ 3 ]

15 голосов
/ 16 февраля 2011

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

2 голосов
/ 12 января 2011

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

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

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

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

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

// MORE EDITS // В XCode4 шаблон проекта теперь называется проектом «Master Detail».Это связано с тем, что он будет настроен в качестве контроллера разделенного просмотра в iPad, но все еще будет обычным проектом навигации в iPhone.Там, где я ссылаюсь на «RootViewController» в ответе, теперь вы найдете что-то под названием «MasterViewController»

0 голосов
/ 12 января 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...