uitabbarcontroller ios xcode

Tab Bar контроллеры

Анатомия Tab Bar интерфейса

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

Виды Tab Bar интерфейса.

uitabbar anatomy

Объекты Tab Bar интерфейса

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

  • UITabBarController объект.
  • По одному объекту контроллера вида для каждой вкладки.
  • Необязательный объект делегат.

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

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

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

  • Установите его прямо как кореневой контроллер вида окна.
  • Установите его в качестве одного из двух контроллеров отображения в интерфейсе с разделением (Split View). (только для iPad).
  • Представьте его модально из другого контроллера вида.
  • Отобразите его из Popovers, (iPad только).

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

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

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

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

Создание Tab Bar интерфейса, используя Storyboard

Если вы создаете новый проект Xcode, используя шаблон Tabbed Application, он создает контроллер панели вкладок в storyboard, установленный в качестве первой сцены.

Чтобы создать контроллер панели вкладок в storyboard, выполните следующие действия:

  • Перетащите Tab Bar Controller из библиотеки.
  • Interface Builder создает Tab Bar контроллер и два контроллера вида, а также отношения между ними. Эти отношения идентифицируют каждый из вновь созданных контроллеров вида в качестве контроллера вида для одной из вкладок контроллера панели вкладок.
  • Отобразите его в качестве первого контроллера вида, выбрав опцию Is Initial View Controller в инспекторе Атрибутов (или представьте контроллер представления вида в пользовательском интерфейсе другим способом.)

Создание Tab Bar интерфейса программно

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

  1. Создайте объект UITabBarController.
  2. Создайте контроллер представления вида контента для каждой вкладки.
  3. Добавбте контроллеры видов в массив и назначьте этот массив свойству viewControllers вашему контроллеру панели вкладок.
  4. Установите контроллер панели вкладок в качестве корневого контроллера вида вашего окна (или иначе представьте его в интерфейсе).

Создание контроллера панели вкладок с нуля.

- (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;
}

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

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

Пример создания элемента вкладки для контроллера пользовательского вида.

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

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

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

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

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

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

- (IBAction)processUserInformation:(id)sender
{
   // Вызовите некий метод приложения для проверки пользовательских данных.
   // если он вернет YES, удалите вкладку.
   if ([self userDataIsValid])
   {
      NSMutableArray* newArray = [NSMutableArray arrayWithArray:self.tabBarController.viewControllers];
      [newArray removeObject:self];
 
      [self.tabBarController setViewControllers:newArray animated:YES];
   }
}

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

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

- (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.

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

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

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

Важно: Добавление или удаление контроллеров видов в интерфейсе панели вкладок также сбрасывает массив настраиваемых контроллеров видов в значение по умолчанию, что позволяет всем контроллерам видов быть вновь настраевыми. Поэтому, если вы вносите изменения в свойство viewControllers (либо непосредственно, либо обратившись к методу setViewControllers:animated:) и по-прежнему хотите ограничить настраиваемые контроллеры видов, необходимо также обновить массив объектов в свойстве customizableViewControllers.

Изменение бейджика вкладки

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

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

uitabbar bage

Чтобы назначить бейджик вкладке присвойте не-нулевое значение свойству badgeValue соответствующему элементу набора вкладок. Листинг ниже показывает пример того, как контроллер вида, который отображает количество новых элементов в своем бейджике может установить значение бейджика.

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

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

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

 
 
homeЗаметили ошибкукарта сайта 
   Made on a Mac