Довольно мало приложений состоят из одного экрана и куда чаще приложение — сложная система с различным количество экранов. Этими экранами выступают контроллеры представления (UIViewController). О них мы уже вспоминали, когда знакомились с Xcode и писали наше первое приложение. Пришло время ознакомиться и изучить контроллеры в iOS и именно этим мы сейчас займемся.
В самой последней версии Xcode на сегодняшний момент (7.3.1) имеется 9 основных видов контроллеров. Для начала разберемся что из себя представляет сам контроллер и дальше рассмотрим все виды по порядку.
View Controller’ы (контроллеры представления) являются основой внутренней структуры iOS приложения. Каждый апп имеет, по меньшей мере, один контроллер представления, и большинство приложений имеют их несколько. Каждый вью контроллер управляет частью пользовательского интерфейса приложения, а также осуществляет взаимодействие между интерфейсом и исходными данными.
Когда в прошлых уроках я называл контроллеры экранами — это было не совсем верно и делалось это с целью облегчить Ваше понимание. Каждое простое приложение имеет следующую иерархию:
Можно сказать, что контроллер — это, своего рода, контейнер, который хранит в себе интерфейс и позволяет связать этот интерфейс с кодом.
Каждый контроллер имеет свой жизненный цикл, который можно «отловить» с помощью его методов:
- viewDidLoad() — этап, на котором вью контроллер завершил свою инициализацию. Данный метод не будет вызываться, если при переходе на контроллер, он уже имеется в памяти системы. К примеру, здесь можно инициализировать все наши компоненты и объекты, которые должны создаваться только раз.
- viewWillAppear() — вызывается каждый раз, когда пользователь совершает переход на контроллер, но тот еще не отобразился на экране. Чаще всего этот этап используется для обновления данных при каждом новом переходе.
- viewDidAppear() — вызывается, когда пользователь совершил переход на этот контроллер, он уже отобразился на экране и завершились все анимации переходов.
- viewWillDisappear() — вызывается, во время перехода на другой экран. К примеру, пользователь нажал кнопку «Назад».
- viewWillDisappear() — вызывается, когда выход из этого контроллера уже завершился.
UIViewController
Это основной контроллер в iOS и именно от него наследуются все остальные контроллеры. Как раз с ним мы и столкнулись в нашем прошлом уроке. Вы можете добавлять на него абсолютно любые графические объекты — кнопки, таблицы, коллекции и т.д.
UITableViewController
Здесь название говорит за себя — данный контроллер представляет из себя таблицу, которая хранит в себе секции и их ячейки. Чаще всего он используется при работе с динамическими данными, либо может предоставлять список статических опций (к примеру, меню навигации). Такие контроллеры лежат в основе практически любых новостных лент (Facebook, VK, Instagram etc), списках контактов и так далее. Работа таких контроллеров построена на источниках данных (Data Source) и методах делегата (Delegate).
UITableViewController в примерах
UICollectionViewController
Данный вид контроллеров позволяет отображать коллекции объектов с помощью согласования с источником данных и делегата. Обычно используется в галлереях. Примером может служить стандартный апп «Фотографии» от Apple. Главным отличием от UITableViewController’а является то, что в таблице ширина ячеек идет от края до края, в то время как в контроллерах коллекции можно задавать произвольные размеры ячеек. Также имеется возможность изменять направление скроллинга (вертикальное, горизонтальное), тип скроллинга (scrolling, paging) и другое.
UICollectionViewController в примерах
UITabBarController
UITabBarController служит чем-то вроде контейнера и объединяет между собой несколько контроллеров. Он позволяет переключаться между вложенными контроллерами с помощью табов, располагающихся внизу экрана. Этот способ навигации используется в огромном количестве приложений. К примеру, в Facebook, App Store, LinkedIn, WOOPSS Music и т.д.
UINavigationController
Данный вид также выступает в роли контейнера и позволяет создавать цепочки контроллеров, делая навигацию между ними проще. UINavigationController по-умолчанию добавляет Navigation Bar вверху обычного контроллера. NavBar, в свою очередь, содержит заголовок, который можно изменить, а также добавляет кнопку «< Назад» для возвращения к предыдущему элементу в цепочке навигации.
Иерархия UINavigationController на примере Xcode
UISplitViewController
Представляет из себя два разделенных между собой контроллера, один из которых является списком чего-либо (UITableViewController), а второй служит для отображения контента выбранного пункта. Применим только для iPad. Ярким примером является стандартное приложение «Настройки» от Apple.
UISplitViewController на примере приложения «Настройки»
UIPageViewController
Представляет последовательность контроллеров как страниц, с помощью согласования с источником данных и делегата. Ориентация навигации может быть горизонтальной, как страницы в книге, или по вертикали, как страницы в виде настенного календаря. Как Вы уже могли догадаться, ярким примером является приложение iBooks от Apple. Также данный вид контроллеров часто используется в разделах «What is new?», где пользователь может ознакомиться с основными новинками обновления, листая их свайпом:
UIPageViewController
GLKitViewController
Класс GLKViewController предоставляет все стандартные функциональные возможности контроллера представления, но дополнительно реализует цикл рендеринга OpenGL ES. Объект GLKViewController работает в связке с объектом GLKView для отображения кадров анимации в представлении.
AVPlayerViewController
Это последний на сегодня контроллер. Он управляет объектом AVPlayer, который может отображать аудио визуализацию контента и стандартные элементы управления воспроизведением. Компонент стал доступен начиная с iOS 8, но данный контроллер не столь популярен, так как большинство приложений поддерживают более старые версии ОС.
Мы рассмотрели все основные контроллеры в iOS и на этом урок подходит к концу. В следующем уроке мы модифицируем наше приложение «Привет, Мир!» добавив к нему больше контроллеров и связав их между собой.