Рассмотрев все основные контроллеры представления в iOS, мы готовы перейти к более подробному изучению некоторых из них. Первым на очереди у нас UINavigationController — основной контроллер навигации, используемый в разработке приложений для iOS.
Для начала создадим новый проект Single View Application и назовем его, к примеру, TestNavi. Откройте сториборд и перед Вами предстанет уже готовый UIViewController, в точности как в уроке «Привет, Мир!». Не забудьте отключить опцию Use Size Classes. На данный момент это одиночный контроллер и нам необходимо «обернуть» его в контроллер навигации.
Добавление контроллера навигации
Это можно сделать двумя способами:
1. Наиболее удобный способ: выделите контроллер, в верхнем меню перейдите по Editor->Embed In и выберите опцию Navigation Controller. В результате мы увидим следующие изменения в сториборде:
UINavigationController и UIViewController
2. Менее удобный способ: в Object library выберите UINavigationController и перетащите его в сториборд. Вы заметите, что Xcode по-умолчанию добавит UINavigationController и UITableViewController. Удалим последний, после чего выделим оставшийся контроллер навигации и добавим связь с нашим контроллером представления подобно тому, как мы связывали кнопку с классом. Протяните связь и в появившемся меню выберите опцию root view controller:
Связь UINavigationController с UIViewController
Данный вид связи между контроллерами в iOS называется segue. По-мимо того, что segue визуально отображает связи между сценами, он также служит для передачи данных между контроллерами и кастомизации переходов.
Обратите внимание на стрелку, которая появилась над связью. Она обозначает контроллер, который будет первоначальным при запуске приложения. Перетащите её с UIViewController‘a на контроллер навигации.
Навигация с UINavigationController
Теперь, когда мы уже подготовили контроллеры, пришло время перейти к самой навигации. Добавим еще один UIViewController в сториборд, перетащив его из Object library. Также поместим кнопку (UIButton) на первоначальный контроллер представления и дадим ей заголовок, к примеру, «Далее«. В результате у Вас должно получиться что-то похожее на это:
Контроллеры и кнопка «Далее»
Возможно Вы будете удивлены, но для того чтобы совершить переход на контроллер представления #2, нам не прийдется писать ни одной строки кода. Достаточно добавить «связь» между кнопкой и контроллером и в появившемся списке опций выбрать Push:
Добавление связи между кнопкой и контроллером
И Вы не поверите, но это всё! Запустим наше приложение и посмотрим как оно работает:
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-связи от кнопок:
1 2 3 4 5 6 7 8 9 |
@IBAction func onBack(sender: AnyObject) { } @IBAction func onBackToBeginning(sender: AnyObject) { } |
Добавим код, который позволит кнопке «Назад» вернуть нас на предыдущую сцену:
1 2 3 4 |
@IBAction func onBack(sender: AnyObject) { self.navigationController?.popViewControllerAnimated(true) } |
Здесь мы обращаемся к текущему классу (self), его дочернему контроллеру навигации (navigationController) и говорим ему вернуться назад (popViewControllerAnimated) с анимацией (true).
Следующий код позволит кнопке «В начало» вернуться к самому первому контроллеру в нашей ветке навигации:
1 2 3 4 |
@IBAction func onBackToBeginning(sender: AnyObject) { self.navigationController?.popToRootViewControllerAnimated(true) } |
Видите, и здесь всё оказалось довольно просто. Запустим приложение и убедимся что всё работает.
Это далеко не все манипуляции, которые можно осуществлять с UINavigationController. Совершим еще одно, наиболее используемое, действие — спрячем и покажем навбар. Добавьте два метода жизненного цикла контроллера в классе LastVC: viewWillAppear() и viewWillDisappear().
Можете начать печатать и Xcode предложит их Вам в выпадающем списке. Выделите необходимый метод и нажмите Enter.
Во viewWillAppear() заставим контроллер прятать навбар, а во viewWillDisappear() будем его снова показывать. Добавьте следующий код:
1 2 3 4 5 6 7 8 9 |
override func viewWillAppear(animated: Bool) { self.navigationController?.navigationBarHidden = true } override func viewWillDisappear(animated: Bool) { self.navigationController?.navigationBarHidden = false } |
Здесь мы, опять же, обращаемся к navigationController текущего класса и вызываем метод navigationBarHidden, который и позволяет прятать/отображать навбар. Запустите приложение и посмотрите что из этого вышло.
Вы можете самостоятельно просмотреть все методы класса UINavigationController и попробовать воспользоваться ими. На этом наш урок закончен.