iOS: представление новых представлений, интерфейс которых загружен из файла xib и содержит контроллер навигации - PullRequest
3 голосов
/ 02 июля 2011

Есть что-то фундаментальное, чего я не понимаю в представлении представлений, которые получают свой интерфейс из файла XIB.

Контроллер корневого представления моего приложения - UITabBarController. Один из параметров панели вкладок представляет представление, управляемое UINavigationController. На панели навигации этого представления у меня есть кнопка «плюс» (+) для добавления нового элемента. Я хочу представить представление AddItem как модальное представление, и его интерфейс должен быть взят из файла AddItemView.xib. Этот файл XIB содержит контроллер навигации.

Однако панель навигации не отображается. Вот функция, которая вызывается при нажатии на кнопку «плюс»:

- (void)showNewView:(UIViewController *)viewController
{
    AddItemViewController *vc = [[AddItemViewController alloc] initWithNibName:@"AddItemViewController" bundle:nil];

//viewController is the UIViewController on which the plus button was tapped
    [viewController.navigationController presentModalViewController:vc animated:NO];
}

Все, что я получаю, это белый экран. Нужно ли что-то делать в viewDidLoad для AddItemViewController? Нужно ли что-то подключать к экземпляру UINavigationController в XIB?

Все это похоже на работу с панелью вкладок, которая находится в файле MainWindow.xib. У UITabBarController есть UINavigationController, который, в свою очередь, имеет подкласс UITableViewController, который, в свою очередь, содержит UITableView, который является исходным содержимым, которое вы видите на экране при нажатии на соответствующую опцию в панели вкладок. Поэтому я не уверен, почему простое вставление этих вещей в IB не приводит к тому же самому.

Как я сказал в начале, я уверен, что эта проблема связана с фундаментальным недоразумением о связи между файлами XIB, их контроллерами представления и контроллерами представления, которые их вызывают. Поэтому, хотя я действительно хочу решить эту конкретную проблему, я бы хотел получить ответ, который поможет устранить это более широкое недоразумение.

1 Ответ

3 голосов
/ 03 июля 2011

Контроллер представления, который вы представляете, это vc, то есть AddItemViewController.Недостаточно того, что в файле .xib есть навигационный контроллер - вам действительно нужно его использовать.; -)

Ознакомьтесь с листингом 6-1 в Представление контроллера представления Модально для примера одного способа сделать то, что вы хотите.Если вы хотите использовать навигационный контроллер, который уже есть в вашем .xib, то создайте для него розетку и представьте ее вместо AddItemViewController, который вы в данный момент представляете.

Все это, кажется,просто работайте с панелью вкладок, которая находится в файле MainWindow.xib.В UITabBarController есть UINavigationController, который, в свою очередь, имеет подкласс UITableViewController, который, в свою очередь, содержит UITableView, который является исходным содержимым ...

Все эти объекты в MainWindow.xib загружаются одновременно и уже связаны друг с другом.Но у вас нет панели вкладок, подключенной напрямую к контроллеру табличного представления, верно?Вы подключили его к контроллеру навигации.Когда нажата соответствующая вкладка, контроллер панели вкладок ничего не знает о контроллере табличного представления - он просто запрашивает у контроллера nav свое представление, а затем контроллер навигации запрашивает у контроллера табличного представления его просмотр, слои с навигационными видами (см. Анатомия интерфейса навигации ) и возврат результата в контроллер панели вкладок.

Представьте себе, что произойдет, если вы сделали подключите контроллер панели вкладок непосредственно к контроллеру табличного представления.На этот раз контроллер панели вкладок будет напрямую обращаться к контроллеру табличного представления, поэтому, когда он запрашивает у контроллера представления вкладки его представление, все, что он возвращает, - это представление контроллера табличного представления, то есть таблицы, без функций навигации.

То же самое происходит с вашим контроллером модального вида.Поскольку вы представляете AddItemViewController, а не контроллер навигации, AddItemViewController - это все, что вы получаете.

...