Навигация с UINavigationController

Рассмотрев все основные контроллеры представления в iOS, мы готовы перейти к более подробному изучению некоторых из них. Первым на очереди у нас UINavigationController — основной контроллер навигации, используемый в разработке приложений для iOS.

Для начала создадим новый проект Single View Application и назовем его, к примеру, TestNavi. Откройте сториборд и перед Вами предстанет уже готовый UIViewController, в точности как в уроке «Привет, Мир!». Не забудьте отключить опцию Use Size Classes. На данный момент это одиночный контроллер и нам необходимо «обернуть» его в контроллер навигации.

Добавление контроллера навигации

Это можно сделать двумя способами:

1. Наиболее удобный способ: выделите контроллер, в верхнем меню перейдите по Editor->Embed In и выберите опцию Navigation Controller. В результате мы увидим следующие изменения в сториборде:

Навигация с UINavigationController

UINavigationController и UIViewController

2. Менее удобный способ: в Object library выберите UINavigationController и перетащите его в сториборд. Вы заметите, что Xcode по-умолчанию добавит UINavigationController и UITableViewController. Удалим последний, после чего выделим оставшийся контроллер навигации и добавим связь с нашим контроллером представления подобно тому, как мы связывали кнопку с классом. Протяните связь и в появившемся меню выберите опцию root view controller:

Навигация с UINavigationController

Связь UINavigationController с UIViewController

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

Обратите внимание на стрелку, которая появилась над связью. Она обозначает контроллер, который будет первоначальным при запуске приложения. Перетащите её с UIViewController‘a на контроллер навигации.

Навигация с UINavigationController

Теперь, когда мы уже подготовили контроллеры, пришло время перейти к самой навигации. Добавим еще один UIViewController в сториборд, перетащив его из Object library. Также поместим кнопку (UIButton) на первоначальный контроллер представления и дадим ей заголовок, к примеру, «Далее«. В результате у Вас должно получиться что-то похожее на это:

Навигация с UINavigationController

Контроллеры и кнопка «Далее»

Возможно Вы будете удивлены, но для того чтобы совершить переход на контроллер представления #2, нам не прийдется писать ни одной строки кода. Достаточно добавить «связь» между кнопкой и контроллером и в появившемся списке опций выбрать Push:

Добавление связи между кнопкой и контроллером

Добавление связи между кнопкой и контроллером

И Вы не поверите, но это всё! Запустим наше приложение и посмотрим как оно работает:

UINavigationController в действии

UINavigationController в действии

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

Как можно заметить, контроллер навигации автоматически добавляет Navigation Bar (далее навбар) к каждому «вложенному» контроллеру и также автоматически добавляет кнопку Back, которая позволяет вернуться на предыдущую сцену.

Каждому навбару можно задать свой заголовок, что поможет нам не потеряться во множестве сцен. Выделите навбар в первом контроллере и в разделе Attributes inspector секции Utilities укажите title «Начало». У второго контроллера задайте значение «Середина». После изменения заголовков, Xcode автоматически отобразит их в сториборде. Также Вы можете задать заголовок для кнопки Back. Укажите в поле Back Button текст «Назад» и нажмите Enter.

Коддинг

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

Далее необходимо добавить новый класс в проект:

  • Class: LastVC.
  • Subclass of: UIViewController.
  • Also create XIB file — нет.
  • Language: Swift.

Свяжем класс LastVC c контроллером «Последний». Чтобы это сделать, выделите его в сториборде и откройте раздел Identity inspector в секции Utilities. В поле класс выберите из выпадающего списка или напишите вручную «LastVC» и нажмите Enter:

Связь контроллера с классом

Связь контроллера с классом

Далее добавим 2 кнопки: «Назад» и «В начало». Откройте класс LastVC  и добавьте две соответствующие action-связи от кнопок:

Добавим код, который позволит кнопке «Назад» вернуть нас на предыдущую сцену:

Здесь мы обращаемся к текущему классу (self), его дочернему контроллеру навигации (navigationController) и говорим ему вернуться назад (popViewControllerAnimated) с  анимацией (true).

Следующий код позволит кнопке «В начало» вернуться к самому первому контроллеру в нашей ветке навигации:

Видите, и здесь всё оказалось довольно просто. Запустим приложение и убедимся что всё работает.

Это далеко не все манипуляции, которые можно осуществлять с UINavigationController. Совершим еще одно, наиболее используемое, действие — спрячем и покажем навбар. Добавьте два метода жизненного цикла контроллера в классе LastVC: viewWillAppear() и viewWillDisappear().

Можете начать печатать и Xcode предложит их Вам в выпадающем списке. Выделите необходимый метод и нажмите Enter.

Быстрое написание методов

Во viewWillAppear() заставим контроллер прятать навбар, а во viewWillDisappear() будем его снова показывать. Добавьте следующий код:

Здесь мы, опять же, обращаемся к navigationController текущего класса и вызываем метод navigationBarHidden, который и позволяет прятать/отображать навбар. Запустите приложение и посмотрите что из этого вышло.

Вы можете самостоятельно просмотреть все методы класса UINavigationController и попробовать воспользоваться ими. На этом наш урок закончен.

  • Роман Нирка

    Подскажите пожалуйста где необходимо указывать следующее ?
    ————————————-

    Далее необходимо добавить новый класс в проект:

    Class: LastVC.
    Subclass of: UIViewController.
    Also create XIB file — нет.
    Language: Swift.

  • Роман Нирка

    Подскажите пожалуйста, почему не удается перетащить кнопки «Назад» и «В начало» с контроллера ПОСЛЕДНИЙ, в ViewController ?

    Делю экран на два, синей линией перетаскиваю кнопку с Main.Storyboard в View.Controller — а она туда не хочет цепляться ?

  • Евгений Понкратенко

    Я могу ошибаться но вероятно второй метод должен быть viewDidAppear, а не viewWillDisappear в последнем примере

    а вообще, все очень классно и понятно, спасибо за уроки!