Контроллеры панели вкладок

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

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

Анатомия интерфейса панели вкладок

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

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

Рисунок 2-1 показывает интерфейс панели вкладок, реализованный приложением Часов. Контроллер панели вкладок имеет свое собственное контейнерное представление, охватывающее все другие представления, включая представление панели вкладок. Пользовательское содержание предоставлено контроллером представления выбранной вкладки.

Рисунок 2-1  представления интерфейса панели вкладок

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

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

Стандартный интерфейс панели вкладок состоит из следующих объектов:

Рисунок 2-2 показывает отношение контроллера панели вкладок к его связанным контроллерам представления. Каждый контроллер представления в контроллере панели вкладок viewControllers свойство контроллер представления для соответствующей вкладки в панели вкладок.

Рисунок 2-2  контроллер панели вкладок и его связанные контроллеры представления

Если Вы добавляете больше чем пять элементов к viewControllers свойство, контроллер панели вкладок автоматически вставляет специальный контроллер представления (названный контроллером представления More) для обработки дисплея дополнительных элементов. Контроллер представления More обеспечивает пользовательский интерфейс, перечисляющий дополнительные контроллеры представления в таблице, которая может расшириться для размещения любого числа контроллеров представления. Контроллер представления More не может быть настроен или выбран и не появляется ни в одном из списков контроллеров представления, которыми управляет контроллер панели вкладок. Появляется автоматически, когда это является необходимым и является отдельным от Вашего пользовательского содержания. Можно получить ссылку на него хотя путем доступа moreNavigationController свойство UITabBarController.

Вы не изменяете представление панели вкладок непосредственно. Объект контроллера панели вкладок собирает содержание панели вкладок от UITabBarItem объекты, предоставленные Вашим довольным контроллеры представления. Рисунок 2-3 показывает отношение между контроллером панели вкладок, контроллерами представления и объектами элемента панели вкладок в приложении iPod. Поскольку существует больше контроллеров представления, чем можно вывести на экран сразу, элементы панели вкладок от только первых четырех контроллеров представления выведены на экран. Заключительный элемент панели вкладок предоставлен контроллером представления More.

  Элементы Панели вкладок рисунка 2-3 приложения iPod

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

Контроллер панели вкладок также поддерживает дополнительный объект делегата, который может использоваться для ответа на выборы панели вкладок и настройки. Для получения информации об ответе на связанные с делегатом сообщения посмотрите Управляющие Вкладки во Время выполнения.

Создание интерфейса панели вкладок

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

Установка интерфейса панели вкладок в главном окне Вашего приложения является безусловно наиболее распространенным способом использовать его. В таком сценарии интерфейс панели вкладок обеспечивает фундаментальный принцип организации для данных Вашего приложения с каждой вкладкой, ведущей пользователя к отличной части приложения. Можно использовать контроллеры панели вкладок собой или в сочетании с другими контроллерами представления для создания еще более сложных интерфейсов. Для получения дополнительной информации посмотрите Объединенные Интерфейсы контроллера Представления.

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

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

Поскольку каждый режим интерфейса панели вкладок является отдельным от всех других режимов, контроллер представления для каждой вкладки определяет содержание для той вкладки. Таким образом контроллер представления, который Вы выбираете для каждой вкладки, должен отразить потребности того определенного режима работы. Если необходимо представить относительно богатый набор данных, Вы могли бы установить контроллер навигации для управления навигацией через те данные. Если представляемые данные более просты, Вы могли бы установить довольное контроллер представления с единственным представлением.

Рисунок 2-4 показывает несколько экранов из приложения Часов. Вкладка World Clock использует контроллер навигации прежде всего так, чтобы она могла представить кнопки, она должна отредактировать список часов. Вкладка Stopwatch требует только единственного экрана для своего всего интерфейса и поэтому использует единственный контроллер представления. Вкладка Timer использует пользовательский контроллер представления для основного экрана и представляет дополнительный контроллер представления модально, когда, Когда касается кнопка Timer Ends.

  Вкладки рисунка 2-4 приложения Часов

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

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

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

При создании нового проекта XCode Снабженный вкладками Шаблон приложений дает Вам контроллер панели вкладок в раскадровке, набор как первая сцена.

Для создания контроллера панели вкладок в раскадровке сделайте следующее:

  1. Перетащите контроллер панели вкладок из библиотеки.

  2. Интерфейсный Разработчик создает контроллер панели вкладок и два контроллера представления, и он создает отношения между ними. Эти отношения идентифицируют каждый из недавно создаваемых контроллеров представления как контроллер представления для одной вкладки контроллера панели вкладок.

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

Создание интерфейса панели вкладок программно

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

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

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

  3. Добавьте контроллеры представления к массиву и присвойте тот массив своему контроллеру панели вкладок viewControllers свойство.

  4. Установите контроллер панели вкладок как корневой контроллер представления Вашего окна (или иначе представьте его в Вашем интерфейсе).

Перечисление 2-1 показывает, что абсолютный код должен был создать и установить интерфейс контроллера панели вкладок в главном окне Вашего приложения. Этот пример создает только две вкладки, но Вы могли создать как много вкладок по мере необходимости путем создания большего количества объектов контроллера представления и добавления их к controllers массив. Необходимо заменить пользовательские имена контроллера представления MyViewController и MyOtherViewController с классами из Вашего собственного приложения.

Перечисление 2-1  , Создающее контроллер панели вкладок с нуля

- (void)applicationDidFinishLaunching:(UIApplication *)application {
   tabBarController = [[UITabBarController alloc] init];
 
   MyViewController* vc1 = [[MyViewController alloc] init];
   MyOtherViewController* vc2 = [[MyOtherViewController alloc] init];
 
   NSArray* controllers = [NSArray arrayWithObjects:vc1, vc2, nil];
   tabBarController.viewControllers = controllers;
 
    window.rootViewController = tabBarController;
}

Создание элемента панели вкладок программно

Для каждого довольного контроллер представления в Вашем интерфейсе панели вкладок, необходимо обеспечить a UITabBarItem объект с изображением и текстом, который будет выведен на экран на соответствующей вкладке. Можно связать элементы панели вкладок с контроллерами представления в любое время прежде, чем вывести на экран интерфейс панели вкладок. Вы делаете это путем присвоения элемента панели вкладок tabBarItem свойство соответствующего контроллера представления. Рекомендуемое время для создания элемента панели вкладок во время инициализации самого контроллера представления, но это обычно выполнимо только для пользовательских контроллеров представления. Можно также создать и инициализировать объект контроллера представления, создать элемент панели вкладок, и затем сделать ассоциацию.

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

Перечисление 2-2  , Создающее элемент панели вкладок контроллера представления

UIImage* anImage = [UIImage imageNamed:@"MyViewControllerImage.png"];
UITabBarItem* theItem = [[UITabBarItem alloc] initWithTitle:@"Home" image:anImage tag:0];

Управление вкладками во время выполнения

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

Добавление и удаление вкладок

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

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

Перечисление 2-3  , Удаляющее текущую вкладку

- (IBAction)processUserInformation:(id)sender
{
   // Call some app-specific method to validate the user data.
   // If the custom method returns YES, remove the tab.
   if ([self userDataIsValid])
   {
      NSMutableArray* newArray = [NSMutableArray arrayWithArray:self.tabBarController.viewControllers];
      [newArray removeObject:self];
 
      [self.tabBarController setViewControllers:newArray animated:YES];
   }
}

Предотвращение выбора вкладок

Если необходимо препятствовать тому, чтобы пользователь выбрал вкладку, можно сделать так путем обеспечения объекта делегата и реализации tabBarController:shouldSelectViewController: метод на том объекте. Предотвращение выбора вкладок должно быть сделано только на временной основе, такой как тогда, когда вкладка не имеет никакого содержания. Например, если Ваше приложение требует, чтобы пользователь предоставил некоторую определенную информацию, такую как имя для входа в систему и пароль, Вы могли отключить все вкладки кроме той, предлагающей пользователю запрошенную информацию. Перечисление 2-4 показывает пример того, на что похож такой метод. hasValidLogin метод является пользовательским методом, который Вы реализуете для проверки предоставленной информации.

Перечисление 2-4  , Предотвращающее выбор вкладок

- (BOOL)tabBarController:(UITabBarController *)aTabBar
         shouldSelectViewController:(UIViewController *)viewController
{
   if (![self hasValidLogin] && (viewController != [aTabBar.viewControllers objectAtIndex:0]) )
   {
      // Disable all but the first tab.
      return NO;
   }
 
   return YES;
}

Наблюдение инициируемых пользователями изменений вкладки

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

  • Пользователь может выбрать вкладку.

  • Пользователь может перестроить вкладки.

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

Для получения дополнительной информации о методах UITabBarControllerDelegate протокол и как Вы используете их, посмотрите Ссылку на протокол UITabBarControllerDelegate.

Предотвращение настройки вкладок

Контроллер представления More предоставляет встроенную поддержку для пользователя для изменения элементов, выведенных на экран в панели вкладок. Для приложений с большим количеством вкладок эта поддержка позволяет пользователю привередничать, какие экраны с готовностью доступны и которые требуют, чтобы достигла дополнительная навигация. Левая сторона рисунка 2-5 показывает Больше экрана выбора, выведенного на экран приложением iPod. Когда пользователь касается кнопки Edit в верхнем левом углу этого экрана, Больше контроллера автоматически выводит на экран экран конфигурации, показанный справа. С этого экрана пользователь может заменить содержание панели вкладок путем перетаскивания новых элементов к нему.

Рисунок 2-5  , Конфигурирующий панель вкладок приложения iPod

В то время как это - хорошая идея позволить пользователю перестроить вкладки большую часть времени, могут быть ситуации, где Вы не могли бы хотеть, чтобы пользователь удалил определенные вкладки из панели вкладок или поместил определенные вкладки в панель вкладок. В этих ситуациях можно присвоить массив объектов контроллера представления к customizableViewControllers свойство. Этот массив должен содержать подмножество контроллеров представления, которые это в порядке для реконструкции. Контроллеры представления не в массиве не выведены на экран на экране конфигурации и не могут быть удалены из панели вкладок, если они уже там.

Изменение значка вкладки

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

Значок является маленьким красным маркером, выведенным на экран в углу вкладки. В значке некоторый пользовательский текст, который Вы обеспечиваете. Как правило, значки содержат численные значения, отражающие число новых элементов, доступных на вкладке, но можно также указать очень короткие символьные строки также. Рисунок 2-6 показывает значки для вкладок в Телефонном приложении.

  Значки рисунка 2-6 для элементов панели вкладок

Для присвоения значка вкладке присвойте ненулевое значение badgeValue свойство из соответствующего элемента панели вкладок. Перечисление 2-5 показывает пример того, как контроллер представления, выводящий на экран число новых элементов в его значке, мог бы установить значение значка.

Перечисление 2-5  , Устанавливающее значок вкладки

if (numberOfNewItems == 0)
   self.tabBarItem.badgeValue = nil;
else
   self.tabBarItem.badgeValue = [NSString stringWithFormat:@"%d", numberOfNewItems];

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

Контроллеры панели вкладок и вращение представления

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

Панели вкладок и полноэкранное расположение

Контроллеры панели вкладок поддерживают полноэкранное расположение по-другому от способа, которым большинство других контроллеров поддерживает его. Можно все еще установить wantsFullScreenLayout свойство из Вашего довольного контроллер представления к YES если Вы хотите его представление к underlap строка состояния или панель навигации (если есть). Однако устанавливая это свойство в YES не вызывает представление к underlap представление панели вкладок. Контроллер панели вкладок всегда изменяет размеры Вашего представления для предотвращения его от underlapping панель вкладок.

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