Навігаційні контролери (navigation controllers) ios uinavigationcontroller, apple, xcode

Навігаційний контролер управляє стеком контролерів видів для підтримки інтерфейсу деталізації розкриття ієрархічного контенту. Видова ієрархія контролера навігації самодостатня. Вона складається з видових уявлень, якими навігаційний контролер управляє безпосередньо і видовими уявленнями, які керують контентом вами наданих контролерів видів. Кожен контент-контролер управляє явним виглядом в ієрархії, і контролер навігації координує навігацію між цією ієрархією видів.
Хоча навігаційний інтерфейс складається в основному з користувацького контенту, є ще місця, де ваш код повинен взаємодіяти безпосередньо з об'єктом контролера навігації. На додаток до сказаного, під час відображення нового виду, ви несете відповідальність за налаштування навігаційного бару в верхній частині екрану, який забезпечує контекст про становище користувача в навігаційної ієрархії. Ви також можете надати деталі для панелі інструментів, яка управляється за допомогою контролера навігації.
Анатомія навігаційного контролера
Основним завданням навігаційного контролера є управління презентацією вмісту свого контролера виду, також він відповідає за подання деяких власних користувальницьких видових уявлень. Зокрема, він представляє панель навігації, яка містить кнопки назад і кілька кнопок, які можна налаштувати. Навігаційний контролер може також (необов'язково) представити вид з панеллю інструментів навігації і заповнити її для користувача кнопками.
Малюнок нижче показує інтерфейс навігації. Вид навігації на цьому малюнку є видом зберігається у властивості view контролера навігації. Всі інші види в інтерфейсі є частиною непрозорої ієрархії видів керованої контролером навігації.

Хоча панель навігації та панель інструментів є налаштованим уявленнями видів, ви ніколи не повинні змінити види в навігаційної ієрархії безпосередньо. Єдиний спосіб налаштувати ці види, - через методи класів UINavigationController і UIViewController.
Об'єкти навігаційного інтерфейсу
Навігаційний контролер використовує кілька об'єктів для реалізації інтерфейсу навігації. Ви несете відповідальність за надання деяких з цих об'єктів, а інші, створюються самим контролером навігації. Зокрема, ви несете відповідальність за надання контролерів видів з контентом. Якщо ви хочете реагувати на повідомлення від контролера навігації, ви також можете надати об'єкт-делегат. Контролер навігації створює образи, - такі як панель навігації та панель інструментів, які використовуються для інтерфейсу навігації, і відповідає за управління цими видами.
У навігаційній панелі і панелі інструментів об'єктів, пов'язаних з контролером навігації, ви можете змінити тільки деякі аспекти їх зовнішнього вигляду і поведінки. Тільки навігаційний контролер відповідає за їх налаштування і відображення. Крім того, об'єкт навігаційного контролера автоматично призначає себе в якості делегата свого UINavigationBar об'єкта і не дозволяє іншим об'єктам ізмененяются це відношення.
Ви можете модифікувати делегата та інші контролери видів в стеці навігації. Стек навігації є колекцією останнім увійшов, першим вийшов об'єктів контролерів виду, який управляється за допомогою контролера навігації. Перший пункт додається в стек, стаючи Кореневим контролером виду і ніколи не виштовхується з стека. Додаткові елементи можуть бути додані в стек за допомогою методів класу UINavigationController.
На малюнку нижче наведені відповідні відносини між контролером навігації і об'єктами в стеці навігації. (Зверніть увагу, що верхня контролер виду (topViewController) і контролер відображуваного виду (visibleViewController) не обов'язково є одним і темже. Наприклад, якщо ви уявляєте контролер виду модально, значення властивості visibleViewController змінюється щоб відобразити контролер виду модально, який був представлений, але властивість topViewController не змінюється.)

Створення навігаційного інтерфейсу
При створенні інтерфейсу навігації, ви повинні вирішити, як ви збираєтеся використовувати інтерфейс навігації. Оскільки це накладає основне значення на організацію ваших даних, ви повинні використовувати його тільки для наступних конкретних цілей:
- Встановіть його прямо як контролер Коренєва виду вікна.
- Встановіть його в якості контролера виду вкладки в інтерфейсі панелі вкладок (Tab bar).
- Встановіть його в якості одного з двох Коренєвих контролерів видів в інтерфейсі з поділом (Split View). (Тільки для iPad).
- Уявити його модально з іншого контролера виду.
- Відобразити його з popover. (Тільки iPad).
У перших трьох сценаріях, контролер навігації забезпечує вирішальну частину вашого основного інтерфейсу і залишається таким, поки програма не виходить. Останні два сценарії відображають більш тимчасове використання контролерів навігації, в цьому випадку застосування контролера навігації є ідентичним процесу для інших контролерів видів контенту. Різниця лише в тому, що контролер навігації продовжує надавати додаткові навігаційні функції, не доступні за допомогою одного контролера уявлення виду контенту.
Завдання контролерів видів контенту для інтерфейсу навігації
Кожен інтерфейс навігації має один рівень даних, який представляє кореневої рівень. Цей рівень є відправною точкою вашого інтерфейсу. Наприклад, додаток "Фото" відображає список доступних фотоальбомів на кореневому рівні його ієрархічної структури даних. Вибираючи фотоальбом здійснюється перехід до відображення мініатюр фотографій в цьому альбомі, вибравши фото здійснюється показ великий версії фотографії.
Щоб реалізувати інтерфейс навігації, ви повинні вирішити, які дані, необхідно представити на кожному рівні ієрархії даних. Для кожного рівня, ви повинні надати контролер виду контенту для управління і представлення даних на даному рівні. Якщо презентація на декількох рівнях і одна і та ж, ви можете створити кілька примірників одного і того ж класу контролера виду і налаштувати кожен з них для управління своїм власним набором даних.
Створення інтерфейсу навігації використовуючи Storyboard
Якщо ви створюєте новий проект Xcode, з використанням шаблону Master-Detail Application, створюється контролер навігації в Storyboard, встановлений в якості першої сцени.
Щоб створити контролер навігації в Storyboard, виконайте наступні дії:
- Перетягніть navigation controller з бібліотеки
- Interface Builder створить навігаційний контролер і контролер виду, а також зв'язок між ними. Цей зв'язок ідентифікує контролер виду, як кореневої для навігаційного контролера.
- Відкрийте його в якості першого контролера уявлення виду, вибравши опцію Is Initial View Controller в інспектора атрибутів (або уявіть контролер виду в інтерфейсі по-іншому.)
Створення інтерфейсу навігації програмно
Якщо ви віддаєте перевагу, створити контролер навігації програмним шляхом, то можете зробити це з будь-якої відповідної точки в коді. Наприклад, якщо контролер навігації обеспечивае корневойт вид для вашого вікна програми, можна створити контролер навігації в методі applicationDidFinishLaunching: вашого делегата програми.
Виконайте наступні кроки для створення навігаційного контролера програмно:
- Створіть кореневої контролер виду (root view controller) для інтерфейсу навігації.
Цей об'єкт є контролером виду верхнього рівня в стеці навігації. Панель навігації відображає кнопку назад, коли відображається його вид і контролер виду не може бути витягнутий з стека навігації.
Приклад простий реалізації applicationDidFinishLaunching. в якому створюється контролер навігації і встановлюється в якості кореневого виду контролера головного вікна програми.
Застосування повноекранної компонування навігаційного контролера
Як правило, навігаційний інтерфейс відображає користувальницький контент в проміжку між нижньою частиною панелі навігації і в верхньою частиною панелі інструментів або панелі вкладок. Проте, замість цього, контролер виду може попросити, щоб його вид відображався як повноекранний макет. Таке розташування дозволяє відображати максимально видиму частину контенту для користувача і може бути корисно для відображення фото або в інших випадках.
При визначенні, чи повинен вид бути змінений в розмірах, щоб заповнити всю або більшу частину екрану, навігаційний контролер розглядає кілька факторів, включаючи наступні:
- Є основне вікно (або батьківський вид) відповідного розміру, щоб заповнити всі межі екрану?
- Настроєна панель навігації як напівпрозора (translucent)?
- Настроєна панель інструментів навігації (якщо використовується) як напівпрозора (translucent)?
- Чи встановлено властивість wantsFullScreenLayout нижчого контролера виду, в YES?
Якщо ви створюєте інтерфейс навігації і хочете, щоб ваш користувальницький контент охопив більшу частину або весь екран, ось кроки, які необхідно зробити:
- Налаштуйте фрейм вашого користувацького уявлення виду, щоб він заповнював межі екрану.
Обов'язково налаштуйте атрибути автоматичної зміни вашого виду. Атрибути автоматичної зміни гарантують, що, якщо ваш вигляд повинен бути змінений, він регулює відповідним чином свій вміст. Крім того, коли ваш вид змінюється, ви можете викликати метод setNeedsLayout вашого виду, щоб показати, що позиція його підвидів повинна бути скоригована.
При поданні навігаційного інтерфейсу, вікно або вид, до якого ви додаєте ваш вид навігації також повинні бути розраховані відповідним чином. Якщо ваш додаток використовує контролер навігації в якості основного інтерфейсу, то ваше головне вікно повинно бути розраховане відповідно до розмірів екрану. Іншими словами, ви повинні встановити його розмір, щоб відповідати властивості bounds класу UIScreen (замість властивості applicationFrame). Насправді, для інтерфейсу навігації, як правило, краще, створити своє вікно з повноекранними межами в будь-яких ситуаціях, оскільки контролер навігації регулює розмір своїх видів, щоб розмістити рядок стану автоматично в будь-якому випадку.
Зміна стека навігації
Ви несете відповідальність за створення об'єктів, які знаходяться в стеку навігації. При ініціалізації об'єкта контролера навігації, ви повинні надати контролер виду контенту для відображення кореневого контенту ієрархії даних. Ви можете додавати або видаляти контролери видів програмно або у відповідь на дії користувача. Клас контролера навігації надає кілька варіантів управління вмістом стека навігації. Ці параметри охоплюють різні сценарії, з якими ви можете зіткнутися в вашому додатку. У цій таблиці наведено ці сценарії і як ви реагуєте на них.
Відображення наступного рівня ієрархії даних
Коли користувач вибирає елемент, який відображається верхнім контролером уявлення виду, можна використовувати перехід (segue) або метод pushViewController: animated. щоб підштовхнути новий контролер виду в стек навігації. Новий контролер виду відповідає за подання вмісту обраного елемента.
Повернення вгору по ієрархії даних
Контролер навігації зазвичай надає кнопку назад, щоб вилучити верхній контролер виду з стека і повернутися до попереднього екрана. Ви також можете видалити верхній контролер виду програмно за допомогою методу popViewControllerAnimated.
Відновлення стека навігації в Попереднє стан
Для того щоб відновити ваше додаток до попереднього стану, необхідно спочатку накопичити достатньо відомостей про стан, щоб відтворити потрібний вид контролерів. Коли користувач закриє ваш додаток, вам буде потрібно, зберегти деякі маркери або іншу інформацію, що вказуватимуть на положення користувача в ієрархії даних. Наступного разу при запуску, ви повинні прочитати цю інформацію про стан і використовувати її, щоб відтворити потрібні контролери видів перед викликом методу setViewControllers: animated.
Ви також можете використовувати цей метод, щоб перейти до довільного місця в ієрархії даних. Перехід в довільне місце може легко призвести до плутанини, тому ви повинні звернути особливу увагу на зв'язок, яка явно здійснюється з користувачем.
Повернення користувача до кореневого контролера виду
Для повернення до верхньої частини навігаційного інтерфейсу, використовуйте метод popToRootViewControllerAnimated. Цей метод видаляє всі, кром Коренєва контролера виду з стека навігації.
Повернення на довільну кількість рівнів в ієрархії
Щоб повернутися більш ніж на один рівень за раз, використовуйте метод popToViewController: animated. Ви можете використовувати цей метод в тих випадках, коли ви використовуєте контролер навігації для управління редагуванням користувацького контенту (а не подання контенту модально). Якщо користувач вирішить скасувати операцію після того, як пройшов кілька екранів редагування, ви можете використовувати цей метод, щоб видалити всі екрани редагування разом, а не по одному.
Моніторинг змін в стеці навігації
Всякий раз, коли ви натискаєте контролер виду, контролер навігації посилає повідомлення ураженим контролерам видів. Контролер навігації також відправляє повідомлення своєму делегату, коли змінюється його стек. Малюнок нижче показує послідовність подій, які відбуваються під час операції і відповідні повідомлення, що відправляються для об'єктів на кожному етапі. Новий контролер виду відображає контролер виду, який збирається стати самим верхнім контролером виду в стеці.

Налаштування зовнішнього вигляду Навігаційного бару
Панель навігації поміщає елементи в трьох основних положеннях: вліво, вправо, і по центру. У таблиці нижче перераховані властивості класу UINavigationItem. які використовуються для настройки кожної з цих позицій. Під час налаштування елемента навігації для використання з контролером навігації, необхідно врахувати, що призначені для користувача елементи управління в деяких позиціях можуть бути проігноровані в інтересах елементів управління навігацією. Опис кожної позиції включає в себе інформацію про те, як використовуються ваші користувальницькі об'єкти.