Объединенные интерфейсы контроллера представления

Можно использовать контроллеры представления, которые платформа UIKit обеспечивает собой или в сочетании с другими контроллерами представления для создания еще более сложных интерфейсов. При объединении контроллеров представления, однако, порядок включения важен; только определенные расположения допустимы. Порядок включения, от дочернего элемента для порождения, следующие:

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

Следующие разделы показывают Вам, как объединить табличное представление, навигацию и контроллеры панели вкладок в Ваших приложениях для iOS. Для получения дополнительной информации об использовании контроллеров представления разделения в приложениях для iPad посмотрите Контроллеры Представления Разделения. Для получения дополнительной информации о табличных представлениях см. Руководство по программированию Табличного представления для iOS.

Добавление контроллера навигации к интерфейсу панели вкладок

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

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

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

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

Создание объектов Используя раскадровку

Создать объединенный интерфейс с тремя вкладками, содержащими пользовательские контроллеры представления и одну вкладку, содержащую контроллер навигации:

  1. Создайте три пользовательских контроллера представления, один для каждой вкладки и контроллера навигации.

  2. Выберите три пользовательских контроллера представления и контроллер навигации (только сцена контроллера навигации, не это - корневой контроллер представления).

  3. Выберите Editor> Embed In> Tab Bar Controller.

  4. Выведите на экран контроллер панели вкладок как первый контроллер представления путем выбора опции Is Initial View Controller в инспекторе Атрибутов (или представьте контроллер представления в пользовательском интерфейсе в другом отношении.)

Создание объектов программно

При создании объединенной панели вкладок и интерфейса навигации программно для главного окна приложения самое надлежащее место, чтобы сделать так находится в applicationDidFinishLaunching: метод Вашего делегата приложения. Следующие шаги объясняют, как создать объединенный интерфейс, где три вкладки содержат пользовательские контроллеры представления, и каждый содержит контроллер навигации:

  1. Создайте UITabBarController объект.

  2. Создайте три пользовательских корневых объекта контроллера представления, один для каждой вкладки.

  3. Создайте дополнительный пользовательский контроллер представления для действия как корневой контроллер представления для интерфейса навигации.

  4. Создайте UINavigationController возразите и инициализируйте его с его корневым контроллером представления.

  5. Добавьте контроллер навигации и три пользовательских контроллера представления к Вашему контроллеру панели вкладок viewControllers свойство.

Перечисление 6-1 показывает, что шаблон кода должен был создать и установить три пользовательских контроллера представления и контроллер навигации как вкладки в интерфейсе панели вкладок. Имена классов пользовательских контроллеров представления являются заполнителями для классов, которые Вы обеспечиваете сами. init метод каждого пользовательского контроллера представления является также методом, который Вы обеспечиваете для инициализации контроллеров представления. tabBarController и window переменные объявляются свойствами делегата приложения классом, поддерживающим сильные ссылки к тем объектам.

Перечисление 6-1  , Создающее контроллер панели вкладок программно

- (void)applicationDidFinishLaunching:(UIApplication *)application {
    self.tabBarController = [[UITabBarController alloc] init];
 
    MyViewController1* vc1 = [[MyViewController1 alloc] init];
    MyViewController2* vc2 = [[MyViewController2 alloc] init];
    MyViewController3* vc3 = [[MyViewController3 alloc] init];
    MyNavRootViewController* vc4 = [[MyNavRootViewController alloc] init];
    UINavigationController* navController = [[UINavigationController alloc]
                            initWithRootViewController:vc4];
 
    NSArray* controllers = [NSArray arrayWithObjects:vc1, vc2, vc3, navController, nil];
    tabBarController.viewControllers = controllers;
 
    window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    window.rootViewController = tabBarController;
    [window makeKeyAndVisible];
}

Даже при создании пользовательских контроллеров представления программно нет никаких ограничений на то, как Вы создаете представление для каждого. Цикл управления представлением является тем же для контроллера представления независимо от того, как это создается, таким образом, можно создать представления или программно или использующий Интерфейсного Разработчика, как описано в Создании Пользовательского Довольный Контроллеры Представления в поле зрения Руководство по программированию Контроллера для iOS.

Отображение контроллера навигации модально

Это совершенно разумно (и относительно распространено) представить контроллеры навигации модально из Вашего приложения. Фактически, многие из стандартной системы просматривают контроллеры (включая UIImagePickerController и ABPeoplePickerNavigationController) контроллеры навигации, которые специально предназначены, чтобы быть представленными модально.

Когда Вы хотите представить свои собственные интерфейсы навигации модально, Вы всегда передаете объект контроллера навигации как первый параметр к presentModalViewController:animated: метод. Необходимо всегда конфигурировать контроллер представления соответственно прежде, чем представить его. Как минимум Ваш контроллер навигации должен иметь корневой контроллер представления. И если Вы хотите запустить пользователя в различной точке в иерархии навигации, необходимо добавить те контроллеры представления к штабелю навигации (без анимаций) прежде, чем представить контроллер навигации.

Перечисление 6-2 показывает пример того, как создать и сконфигурировать контроллер навигации и вывести на экран его модально. В примере контроллеры представления, продвинутые на штабель навигации, являются пользовательскими объектами, которые необходимо определить и сконфигурировать с представлениями. И currentViewController объект является ссылкой на в настоящее время видимый контроллер представления, который также необходимо обеспечить.

Перечисление 6-2  , Выводящее на экран контроллер навигации модально

MyViewController1*  rootVC = [[MyViewController1 alloc] init];
MyViewController2*  nextVC = [[MyViewController2 alloc] init];
NSArray * viewControllers = [NSArray arrayWithObjects:rootVC, nextVC, nil];
 
// Create the nav controller and set the view controllers.
UINavigationController*  theNavController = [[UINavigationController alloc]
                          initWithRootViewController:rootVC];
[theNavController setViewControllers:viewControllers animated:NO];
 
// Display the nav controller modally.
[currentViewController presentModalViewController:theNavController animated:YES];

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

Для получения информации о том, как представить контроллеры представления (включая контроллеры навигации) модально, посмотрите Контроллеры Представления Представления от Других Контроллеров Представления в поле зрения Руководство по программированию Контроллера для iOS. Для получения дополнительной информации о том, как сконфигурировать контроллер навигации для использования в Вашем приложении, посмотрите Контроллеры Навигации.

Отображение контроллера панели вкладок модально

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

При представлении контроллера панели вкладок модально, Вы всегда передаете объект контроллера панели вкладок как первый параметр к presentModalViewController:animated: метод. Контроллер панели вкладок должен уже быть сконфигурирован перед представлением его. Поэтому необходимо создать корневые контроллеры представления, сконфигурировать их и добавить их к контроллеру панели вкладок так же, как если бы Вы устанавливали интерфейс панели вкладок в своем главном окне.

Как со всеми другими модально представленными контроллерами представления, родительский контроллер представления ответственен за отклонение его модально представленного дочернего контроллера представления в ответ на надлежащее пользовательское действие. При отклонении контроллера панели вкладок, хотя, помните, что выполнение так удаляет не только объект контроллера панели вкладок, но также и контроллеры представления, связанные с каждой вкладкой. Контроллеры представления, которые не видимы, просто демонтированы, но контроллер представления, выведенный на экран на в настоящее время видимой вкладке также, получает обычное viewWillDisappear: сообщение.

Для получения информации о том, как представить контроллеры представления (включая контроллеры навигации) модально, посмотрите Контроллеры Представления Представления от Других Контроллеров Представления в поле зрения Руководство по программированию Контроллера для iOS. Для получения информации о том, как сконфигурировать контроллер панели вкладок для использования в Вашем приложении, посмотрите Контроллеры Панели вкладок.

Используя контроллеры табличного представления в интерфейсе навигации

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

Один способ управлять таблицами с a UITableViewController объект. Несмотря на то, что этот класс делает управление табличными данными намного проще, все еще необходимо реализовать пользовательский код для упрощения навигации. В частности, когда пользователь касается строки в таблице, необходимо продвинуть надлежащий новый объект контроллера представления на штабель навигации.

Перечисление 6-3 показывает пример того, как перейти к следующему уровню данных в интерфейсе навигации. Каждый раз, когда пользователь касается определенной строки в текущей таблице, Вы используете информацию, связанную с той строкой для инициализации нового контроллера представления, который Вы тогда продвигаете на штабель навигации. initWithTable:andDataAtIndexPath: метод является пользовательским методом, который необходимо реализовать сами; его задание должно получить объект данных для строки и использовать его для инициализации следующего контроллера представления уровня.

Перечисление 6-3  , Перешедшее по данным с помощью табличных представлений

// Implement something like this in your UITableViewController subclass
// or in the delegate object you use to manage your table.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
   // Create a view controller with the title as its
   // navigation title and push it.
   NSUInteger row = indexPath.row;
   if (row != NSNotFound)
   {
      // Create the view controller and initialize it with the
      // next level of data.
      MyViewController *viewController = [[MyViewController alloc]
                   initWithTable:tableView andDataAtIndexPath:indexPath];
      [[self navigationController] pushViewController:viewController
                   animated:YES];
   }
}

Для более подробной информации об управляющих таблицах и контроллерах табличного представления использования, см. Руководство по программированию Табличного представления для iOS.