Панели вкладок и контроллеры панели вкладок в Xamarin.iOS
Приложения tabbed используются в iOS для поддержки пользовательских интерфейсов, в которых доступ к нескольким экранам не выполняется в определенном порядке. Благодаря классу UITabBarController
приложения могут легко включать поддержку таких сценариев с несколькими экранами. UITabBarController
обеспечивает управление несколькими экранами, что позволяет разработчику приложений сосредоточиться на деталях каждого экрана.
Как правило, приложения с вкладками создаются с UITabBarController
основным RootViewController
окном. Однако при использовании дополнительного кода приложения табуляции также можно использовать в последовательности для другого начального экрана, например сценария, в котором приложение сначала представляет экран входа, а затем — интерфейс табуляции.
На этой странице рассматриваются оба сценария: когда вкладки находятся в корне иерархии представления приложения, а также в сценарии, отличномRootViewController
от сценария.
Знакомство с UITabBarController
Поддержка UITabBarController
разработки приложений с вкладками по следующим параметрам:
- Разрешение добавления в него нескольких контроллеров.
- Предоставление пользовательского интерфейса с вкладками через
UITabBar
класс, чтобы разрешить пользователю переключаться между контроллерами и их представлениями.
Контроллеры добавляются в UITabBarController
его ViewControllers
свойство, которое является массивом UIViewController
. Сам UITabBarController
по себе обрабатывает загрузку соответствующего контроллера и представление на основе выбранной вкладки.
Вкладки — это экземпляры UITabBarItem
класса, которые содержатся в экземпляре UITabBar
. Каждый UITabBar
экземпляр доступен через TabBarItem
свойство контроллера на каждой вкладке.
Чтобы понять, как работать с ним UITabBarController
, давайте рассмотрим создание простого приложения, использующего его.
Пошаговое руководство по приложению tabbed
В этом пошаговом руководстве мы создадим следующее приложение:
Хотя шаблон приложения с вкладками уже доступен в Visual Studio для Mac, в этом примере эти инструкции работают из пустого проекта, чтобы лучше понять, как создается приложение.
Создание приложения
Начните с создания нового приложения.
Выберите пункт меню "Создать > решение" > в Visual Studio для Mac и выберите шаблон пустого проекта приложения > iOS>, назовите проектTabbedApplication
, как показано ниже:
Добавление UITabBarController
Затем добавьте пустой класс, выбрав "Создать файл>" и выбрав шаблон "Общий: пустой класс". Назовите файл TabController
, как показано ниже:
Класс TabController
будет содержать реализацию UITabBarController
массива UIViewControllers
. Когда пользователь выбирает вкладку, UITabBarController
он будет заботиться о представлении соответствующего контроллера представления.
Чтобы реализовать необходимые UITabBarController
действия, выполните следующие действия.
- Задайте для базового класса
TabController
UITabBarController
значение . - Создание
UIViewController
экземпляров для добавления в объектTabController
. UIViewController
Добавьте экземпляры в массив, назначенныйViewControllers
свойству объектаTabController
.
Добавьте следующий код в TabController
класс, чтобы выполнить следующие действия:
using System;
using UIKit;
namespace TabbedApplication {
public class TabController : UITabBarController {
UIViewController tab1, tab2, tab3;
public TabController ()
{
tab1 = new UIViewController();
tab1.Title = "Green";
tab1.View.BackgroundColor = UIColor.Green;
tab2 = new UIViewController();
tab2.Title = "Orange";
tab2.View.BackgroundColor = UIColor.Orange;
tab3 = new UIViewController();
tab3.Title = "Red";
tab3.View.BackgroundColor = UIColor.Red;
var tabs = new UIViewController[] {
tab1, tab2, tab3
};
ViewControllers = tabs;
}
}
}
Обратите внимание, что для каждого UIViewController
экземпляра UIViewController
мы устанавливаем Title
свойство . Когда контроллеры добавляются UITabBarController
в него, UITabBarController
будут считываться Title
для каждого контроллера и отображать его на метках связанной вкладки, как показано ниже:
Задание TabController в качестве RootViewController
Порядок размещения контроллеров на вкладках соответствует порядку их добавления в ViewControllers
массив.
Чтобы загрузить UITabController
его в качестве первого экрана, необходимо сделать его окно RootViewController
, как показано в следующем коде для AppDelegate
:
[Register ("AppDelegate")]
public partial class AppDelegate : UIApplicationDelegate
{
UIWindow window;
TabController tabController;
public override bool FinishedLaunching (UIApplication app, NSDictionary options)
{
window = new UIWindow (UIScreen.MainScreen.Bounds);
tabController = new TabController ();
window.RootViewController = tabController;
window.MakeKeyAndVisible ();
return true;
}
}
Если мы запустите приложение сейчас, будет загружена первая вкладка, UITabBarController
выбранная по умолчанию. Выбор любой из других вкладок приводит к отображению UITabBarController,
представления связанного контроллера, как показано ниже, где конечный пользователь выбрал вторую вкладку:
Изменение tabBarItems
Теперь, когда у нас есть запущенное приложение табуляции, давайте изменим TabBarItem
изображение и текст, отображаемый, а также добавьте значок на одну из вкладок.
Настройка системного элемента
Сначала давайте задали первую вкладку для использования системного элемента. В конструкторе удалите TabController
строку, которая задает контроллер Title
для tab1
экземпляра и замените его следующим кодом, чтобы задать свойство контроллера TabBarItem
:
tab1.TabBarItem = new UITabBarItem (UITabBarSystemItem.Favorites, 0);
При создании с помощью заголовка UITabBarItem
и изображения автоматически предоставляются iOS, как показано на снимке экрана ниже с значком избранного и заголовком на первой вкладке:UITabBarSystemItem
Настройка образа
Помимо использования системного элемента, заголовок и изображение можно UITabBarItem
задать для пользовательских значений. Например, измените код, который задает TabBarItem
свойство контроллера tab2
следующим образом:
tab2 = new UIViewController ();
tab2.TabBarItem = new UITabBarItem ();
tab2.TabBarItem.Image = UIImage.FromFile ("second.png");
tab2.TabBarItem.Title = "Second";
tab2.View.BackgroundColor = UIColor.Orange;
Приведенный выше код предполагает, что имя second.png
изображения было добавлено в корень проекта (или каталог Resources ). Для поддержки всех плотностей экрана вам потребуется три изображения, как показано ниже:
Рекомендуемый размер зависит от стиля изображения (циклический, квадратный, широкий или высокий).
Свойство Image
должно быть задано только для имени файла second.png , iOS автоматически загружает файлы с более высоким разрешением при необходимости. Дополнительные сведения см. в руководствах по работе с изображениями . По умолчанию элементы панели вкладок серые, с синим цветом при выборе.
Переопределение заголовка
Title
Если свойство задано непосредственно на TabBarItem
контроллере, оно переопределит любое значение, Title
заданное для самого контроллера.
На следующем снимке экрана показана вторая (средняя) вкладка с пользовательским заголовком и изображением:
Задание значения индикатора событий
Вкладка также может отображать значок. Например, добавьте следующую строку кода, чтобы задать значок на третьей вкладке:
tab3.TabBarItem.BadgeValue = "Hi";
При выполнении это приведет к красной метке со строкой "Привет" в левом верхнем углу вкладки, как показано ниже:
Эмблема часто используется для отображения непрочитанных и новых элементов с указанием числа. Чтобы удалить значок, задайте BadgeValue
значение NULL, как показано ниже:
tab3.TabBarItem.BadgeValue = null;
Вкладки в сценариях, отличных от RootViewController
В приведенном выше примере показано, как работать с UITabBarController
RootViewController
окном. В этом примере мы рассмотрим, как использовать то, когда оно не RootViewController
является и показывает, как это создается с помощью UITabBarController
раскадровки.
Пример начального экрана
В этом сценарии начальный экран загружается с контроллера, который не UITabBarController
является. Когда пользователь взаимодействует с экраном, нажав кнопку, тот же контроллер представления будет загружен в UITabBarController
объект, который затем будет представлен пользователю. На следующем снимке экрана показана блок-схема приложения.
Давайте начнем новое приложение для этого примера. Опять же, мы будем использовать шаблон пустого проекта iPhone > ( > C#), на этот раз именовав проект InitialScreenDemo
.
В этом примере раскадровка используется для размещения контроллеров представления. Чтобы добавить раскадровку, выполните приведенные действия.
Щелкните правой кнопкой мыши имя проекта и выберите "Добавить > новый файл".
Когда появится диалоговое окно "Создать файл", перейдите к iOS > Empty iPhone Storyboard.
Давайте вызовем этот новый раскадровки MainStoryboard , как показано ниже:
При добавлении раскадровки в ранее не раскадровки, которые описаны в руководстве "Введение в раскадровки". К ним относятся:
Добавьте имя раскадровки в раздел "Основной интерфейс" в разделе
Info.plist
:App Delegate
Переопределите метод Window в следующем коде:public override UIWindow Window { get; set; }
Для этого примера нам потребуется три контроллера представления. Один из них ViewController1
будет использоваться в качестве контроллера начального представления и на первой вкладке. Остальные два, именованные ViewController2
и ViewController3
, которые будут использоваться на второй и третьей вкладках соответственно.
Откройте конструктор, дважды щелкнув файл MainStoryboard.storyboard и перетащите три контроллера представления в область конструктора. Мы хотим, чтобы каждый из этих контроллеров представления должен иметь собственный класс, соответствующий имени выше, поэтому в разделе "Класс удостоверений>" введите его имя, как показано на снимке экрана ниже:
Visual Studio для Mac автоматически создаст необходимые классы и файлы конструктора, это можно увидеть на панели решения, как показано ниже:
Создание пользовательского интерфейса
Затем мы создадим простой пользовательский интерфейс для каждого представления ViewController с помощью конструктора Xamarin iOS.
Мы хотим перетащить объект Label
в Button
ViewController1 из ToolBox справа. Далее мы будем использовать панель свойств для изменения имени и текста элементов управления следующим образом:
- Метка :
Text
= Один - Кнопка :
Title
= пользователь принимает некоторое начальное действие
Мы будем контролировать видимость нашей кнопки в TouchUpInside
событии, и нам нужно ссылаться на нее в коде. Давайте определим его с именем aButton
на панели свойств, как показано на следующем снимке экрана:
Теперь поверхность конструктора должна выглядеть примерно так, как на снимок экрана ниже:
Давайте добавим более подробную информацию ViewController2
ViewController3
и , добавив метку к каждому, и измените текст на "Два" и "Три" соответственно. Это выделяет пользователя, на какой вкладке или представлении мы смотрим.
Подключение кнопки
Мы собираемся загрузить ViewController1
при первом запуске приложения. Когда пользователь нажимает кнопку, мы скроем кнопку и загрузим UITabBarController
ViewController1
экземпляр на первой вкладке.
Когда пользователь освобождает aButton
событие TouchUpInside, необходимо активировать событие TouchUpInside. Давайте нажимаем кнопку и на вкладке "События" панели "Свойства" объявите обработчик событий , InitialActionCompleted
чтобы его можно было ссылаться в коде. Это показано на снимке экрана ниже:
Теперь необходимо сообщить контроллеру представления, чтобы скрыть кнопку при срабатывании InitialActionCompleted
события. Добавьте ViewController1
следующий частичный метод:
partial void InitialActionCompleted (UIButton sender)
{
aButton.Hidden = true;
}
Сохраните файл и запустите приложение. Появится экран, и кнопка исчезнет на сенсорном экране.
Добавление контроллера панели вкладок
Теперь у нас есть наше начальное представление, как ожидалось. Далее мы хотим добавить его в UITabBarController
, а также представления 2 и 3. Давайте открываем раскадровки в конструкторе.
На панели элементов найдите контроллер панели вкладок в разделе "Контроллеры и объекты" и перетащите его в область конструктора. Как видно на снимке экрана ниже, контроллер панели вкладок меньше пользовательского интерфейса и поэтому содержит два контроллера представления по умолчанию:
Удалите эти новые контроллеры представления, выбрав черную панель в нижней части и нажав клавишу DELETE.
В раскадровки можно использовать segues для обработки переходов между TabBarController и нашими контроллерами представления. После взаимодействия с начальным представлением мы хотим загрузить его в tabBarController, представленный пользователю. Давайте настроим эту настройку в конструкторе.
Ctrl-Click and Drag from the button to the TabBarController. В контекстном меню появится контекстное меню. Мы хотим использовать модальное продолжение.
Чтобы настроить каждую из наших вкладок, ctrl-click из tabBarController к каждому из наших контроллеров представления в порядке от одного до трех, и выберите вкладку "Связь" в контекстном меню, как показано ниже:
Раскадровка должна выглядеть следующим образом:
Если щелкнуть один из элементов панели вкладок и просмотреть панель свойств, можно увидеть ряд различных параметров, как показано ниже:
Это можно использовать для изменения определенных атрибутов, таких как эмблема, заголовок и идентификатор iOS, среди прочего.
Если сохранить и запустить приложение сейчас, мы найдем, что кнопка снова появится при загрузке экземпляра ViewController1 в tabBarController. Давайте исправим это, проверив, есть ли в текущем представлении родительский контроллер представления. Если это так, мы знаем, что мы внутри TabBarController, и поэтому кнопка должна быть скрыта. Давайте добавим приведенный ниже код в класс ViewController1:
public override void ViewDidLoad ()
{
if (ParentViewController != null){
aButton.Hidden = true;
}
}
Когда приложение запускается и пользователь нажимает кнопку на первом экране, пользовательский интерфейсTabBarController загружается с первого экрана, размещенного на первой вкладке, как показано ниже:
Итоги
В этой статье описано, как использовать UITabBarController
приложение. Мы пошаговые инструкции по загрузке контроллеров на каждой вкладке, а также настройке свойств на вкладках, таких как название, изображение и эмблема. Затем мы рассмотрели, используя раскадровки, как загрузить UITabBarController
во время выполнения, когда оно не является окном RootViewController
.