NavigationView — контейнерний компонент SwiftUI для організації стекової навігації між екранами. NavigationView створює навігаційний стек з автоматичною панеллю, заголовком і кнопкою «Назад». Починаючи з iOS 16, Apple рекомендує використовувати NavigationStack. Детальніше читайте в документації Apple.
Головне
NavigationView — контейнер SwiftUI, який обгортає ієрархію екранів і надає навігаційний інтерфейс. Усередині NavigationView працює NavigationLink — елемент, при натисканні на який поточний екран замінюється новим. NavigationView автоматично додає navigation bar із заголовком і кнопкою «Назад».
NavigationView з'явився в iOS 13 разом із SwiftUI. Концептуально він замінює UINavigationController з UIKit, але реалізований декларативно. Замість ручного push/pop розробник описує зв'язок між екранами через NavigationLink. Система автоматично керує стеком.
NavigationView підтримує модифікатори .navigationTitle, .navigationBarTitleDisplayMode, .toolbar та .searchable. Для iOS 16+ Apple представила NavigationStack, який зберігає API NavigationView, але додає програмне керування стеком через NavigationPath. Для проєктів із підтримкою iOS 15 і нижче NavigationView залишається єдиним варіантом.
NavigationLink — елемент SwiftUI, який створює перехід на цільовий екран усередині NavigationView або NavigationStack. При натисканні на NavigationLink система додає цільовий екран до стеку навігації. Анімація переходу — стандартний push справа для iOS, адаптується під платформу.
struct ContentView: View {
var body: some View {
NavigationView {
List(items) { item in
NavigationLink(destination: DetailView(item: item)) {
Text(item.title)
}
}
.navigationTitle("Список")
}
}
}
struct DetailView: View {
let item: Item
var body: some View {
VStack {
Text(item.description)
.navigationTitle(item.title)
.navigationBarTitleDisplayMode(.inline)
}
}
}NavigationLink приймає два параметри: destination — цільова View, та label — елемент, на який користувач натискає. Для списків зручний синтаксис із value та NavigationLink(value:), який автоматично знімає виділення комірки та працює з NavigationPath.
З iOS 16 Apple представила NavigationStack як заміну NavigationView. NavigationStack зберігає декларативний синтаксис, але додає критично важливу можливість — програмне керування стеком через властивість path типу NavigationPath або масив Hashable.
| Можливість | NavigationView (iOS 13-15) | NavigationStack (iOS 16+) |
|---|---|---|
| Програмний push | Ні, тільки через NavigationLink | Так, через path.append(value) |
| popToRoot | Тільки dismiss до root | path.removeLast(path.count) |
| Deep Links | Складна реалізація | Вбудована підтримка через path |
| Типізація стеку | Ні (будь-яка View у destination) | Так (масив Hashable значень) |
| SplitView iPad | ColumnStyle / StackStyle | NavigationSplitView (iOS 16+) |
Для проєктів із мінімальною версією iOS 16+ використовуйте NavigationStack. Для підтримки iOS 14-15 — NavigationView. NavigationStack не має прямих аналогів для старих версій, тому оновлення потребує перевірки сумісності.
Модифікатори .toolbar та .navigationTitle керують вмістом навігаційної панелі. .navigationTitle задає заголовок екрана, .navigationBarTitleDisplayMode вибирає стиль: .large (великий, за замовчуванням) або .inline (компактний, як у Налаштуваннях). .toolbar додає кнопки, пошук та сегментований контроль.
struct SettingsView: View {
var body: some View {
NavigationStack {
Form {
Section("Профіль") {
Text("Ім'я користувача")
Toggle("Сповіщення", isOn: $notifications)
}
}
.navigationTitle("Налаштування")
.navigationBarTitleDisplayMode(.large)
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button("Зберегти") { save() }
}
ToolbarItem(placement: .navigationBarLeading) {
EditButton()
}
}
}
}
}.searchable — ще один модифікатор, який інтегрує рядок пошуку в navigation bar. Працює як із NavigationView, так і з NavigationStack. Пошук автоматично ховається при скролі та показується при свайпі вниз. Підтримує фільтрацію списку через Binding String.
NavigationPath — тип iOS 16+, який представляє стек навігації як колекцію значень Hashable. Розробник додає елементи до path для програмного переходу, видаляє для повернення. NavigationPath підтримує глибокі посилання, push-сповіщення та відновлення стану.
struct AppNavigation: View {
@State private var path = NavigationPath()
var body: some View {
NavigationStack(path: $path) {
List(categories) { category in
NavigationLink("Категорія \(category.name)",
value: category)
}
.navigationTitle("Категорії")
.navigationDestination(for: Category.self) { category in
ProductListView(category: category)
}
.navigationDestination(for: Product.self) { product in
ProductDetailView(product: product)
}
}
// Програмний перехід за deep link
.onOpenURL { url in
guard let productId = DeepLinkParser.parse(url) else { return }
path.append(Product(id: productId))
}
}
}.navigationDestination(for:) реєструє тип даних, для якого потрібно показати екран. Коли до path додається значення цього типу, система автоматично створює цільову View. Такий підхід замінює явний NavigationLink(destination:) і робить навігацію суворо типізованою.
NavigationView та NavigationStack працюють на всіх платформах Apple: iOS, iPadOS, watchOS, tvOS та macOS. Поведінка адаптується під екран. На iPad NavigationStack підтримує NavigationSplitView, який замінює UISplitViewController з UIKit і відображає дві колонки на широкому екрані.
NavigationSplitView (iOS 16+) розділяє екран на sidebar (список) і деталі. На iPhone sidebar прихований, показуючи лише деталі через NavigationLink. На iPad sidebar і деталі відображаються одночасно в режимі split.
struct AdaptiveNavigation: View {
@State private var selectedCategory: Category?
var body: some View {
NavigationSplitView {
List(categories, selection: $selectedCategory) { category in
Text(category.name)
}
.navigationTitle("Категорії")
} detail: {
ProductListView(category: selectedCategory)
}
}
}NavigationSplitView автоматично вибирає оптимальний режим відображення для кожного пристрою. На iPhone у портреті — стек, на iPad та iPhone у ландшафті — split. Розробнику не потрібно писати окремий код для різних size classes.
Часті запитання
NavigationView — старий API (iOS 13-15), підтримує лише декларативні NavigationLink. NavigationStack — новий API (iOS 16+), додає path для програмної навігації, глибоких посилань і суворо типізованого стеку. Apple рекомендує NavigationStack для нових проєктів.
Через модифікатор .toolbar з ToolbarItem. Наприклад: .toolbar { ToolbarItem(placement: .navigationBarTrailing) { Button('Налаштування') { } } }. Placement визначає позицію: trailing (праворуч), leading (ліворуч), principal (центр).
Заголовок задається через .navigationTitle('Назва'). Стиль — .navigationBarTitleDisplayMode(.large) або .inline. Large — великий заголовок у стилі iOS Music, inline — компактний, як у Налаштуваннях. Стиль можна змінювати для кожного екрана окремо.
Три способи: через value (NavigationLink(value:item) { Label }, iOS 16+), через destination + label, через isActive для програмного переходу. NavigationLink із value чистіший для списків, оскільки не потребує створення цільової View до переходу.
Так. NavigationView та NavigationStack доступні на iOS, iPadOS, watchOS, tvOS та macOS. На watchOS навігація використовує ієрархію інтерфейсу з Digital Crown, на tvOS — фокусне введення з пульта. Поведінка адаптується під платформу автоматично.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.