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

Контроллеры в iOS

Довольно мало приложений состоят из одного экрана и куда чаще приложение — сложная система с различным количество экранов. Этими экранами выступают контроллеры представления (UIViewController). О них мы уже вспоминали, когда знакомились с Xcode и писали наше первое приложение.  Пришло время ознакомиться и изучить контроллеры в iOS и именно этим мы сейчас займемся.

В самой последней версии Xcode на сегодняшний момент (7.3.1) имеется 9 основных видов контроллеров. Для начала разберемся что из себя представляет сам контроллер и дальше рассмотрим все виды по порядку.

View Controller’ы (контроллеры представления) являются основой внутренней структуры iOS приложения. Каждый апп имеет, по меньшей мере, один контроллер представления, и большинство приложений имеют их несколько. Каждый вью контроллер управляет частью пользовательского интерфейса приложения, а также осуществляет взаимодействие между интерфейсом и исходными данными.

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

Контроллеры в iOS

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

Каждый контроллер имеет свой жизненный цикл, который можно «отловить» с помощью его методов:

  • viewDidLoad() — этап, на котором вью контроллер завершил свою инициализацию. Данный метод не будет вызываться, если при переходе на контроллер, он уже имеется в памяти системы. К примеру, здесь можно инициализировать все наши компоненты и объекты, которые должны создаваться только раз.
  • viewWillAppear() — вызывается каждый раз, когда пользователь совершает переход на контроллер, но тот еще не отобразился на экране. Чаще всего этот этап используется для обновления данных при каждом новом переходе.
  • viewDidAppear() — вызывается, когда пользователь совершил переход на этот контроллер, он уже отобразился на экране и завершились все анимации переходов.
  • viewWillDisappear() — вызывается, во время перехода на другой экран. К примеру, пользователь нажал кнопку «Назад».
  • viewWillDisappear() — вызывается, когда выход из этого контроллера уже завершился.

UIViewController

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

UITableViewController

Здесь название говорит за себя — данный контроллер представляет из себя таблицу, которая хранит в себе секции и их ячейки. Чаще всего он используется при работе с динамическими данными, либо может предоставлять список статических опций (к примеру, меню навигации). Такие контроллеры лежат в основе практически любых новостных лент (Facebook, VK, Instagram etc), списках контактов и так далее. Работа таких контроллеров построена на источниках данных (Data Source) и методах делегата (Delegate).

Контроллеры в iOS

UITableViewController в примерах

UICollectionViewController

Данный вид контроллеров позволяет отображать коллекции объектов  с помощью согласования с источником данных и делегата. Обычно используется в галлереях. Примером может служить стандартный апп «Фотографии» от Apple. Главным отличием от UITableViewController’а является то, что в таблице ширина ячеек идет от края до края, в то время как в контроллерах коллекции можно задавать произвольные размеры ячеек. Также имеется возможность изменять направление скроллинга (вертикальное, горизонтальное), тип скроллинга (scrolling, paging) и другое.

Контроллеры в iOS

UICollectionViewController в примерах

UITabBarController

UITabBarController служит чем-то вроде контейнера и объединяет между собой несколько контроллеров. Он позволяет переключаться между вложенными контроллерами с помощью табов, располагающихся внизу экрана. Этот способ навигации используется в огромном количестве приложений. К примеру, в Facebook, App Store, LinkedIn, WOOPSS Music и т.д.

UINavigationController

Данный вид также выступает в роли контейнера и позволяет создавать цепочки контроллеров, делая навигацию между ними проще. UINavigationController по-умолчанию добавляет Navigation Bar вверху обычного контроллера. NavBar, в свою очередь, содержит заголовок, который можно изменить, а также добавляет кнопку «< Назад» для возвращения к предыдущему элементу в цепочке навигации.

Контроллеры в iOS

Иерархия UINavigationController на примере Xcode

UISplitViewController

Представляет из себя два разделенных между собой контроллера, один из которых является списком чего-либо (UITableViewController), а второй служит для отображения контента выбранного пункта. Применим только для iPad. Ярким примером является стандартное приложение «Настройки» от Apple.

Контроллеры в iOS

UISplitViewController на примере приложения «Настройки»

UIPageViewController

Представляет последовательность контроллеров как страниц, с помощью согласования с источником данных и делегата. Ориентация навигации может быть горизонтальной, как страницы в книге, или по вертикали, как страницы в виде настенного календаря. Как Вы уже могли догадаться, ярким примером является приложение iBooks от Apple. Также данный вид контроллеров часто используется в разделах «What is new?», где пользователь может ознакомиться с основными новинками обновления, листая их свайпом:

Контроллеры в iOS

UIPageViewController

GLKitViewController

Класс GLKViewController предоставляет все стандартные функциональные возможности контроллера представления, но дополнительно реализует цикл рендеринга OpenGL ES. Объект GLKViewController работает в связке с объектом GLKView для отображения кадров анимации в представлении.

AVPlayerViewController

Это последний на сегодня контроллер. Он управляет объектом AVPlayer, который может отображать аудио визуализацию контента и стандартные элементы управления воспроизведением. Компонент стал доступен начиная с iOS 8, но данный контроллер не столь популярен, так как большинство приложений поддерживают более старые версии ОС.


Мы рассмотрели все основные контроллеры в iOS и на этом урок подходит к концу. В следующем уроке мы модифицируем наше приложение «Привет, Мир!» добавив к нему больше контроллеров и связав их между собой.