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 (списък) и detail (детайли). На iPhone sidebar е скрит, показвайки само detail чрез NavigationLink. На iPad sidebar и detail се показват едновременно в 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 class-ове.
Често задавани въпроси
NavigationView — старо API (iOS 13-15), поддържа само декларативни NavigationLink. NavigationStack — ново API (iOS 16+), добавя path за програмна навигация, дълбоки връзки и строго типизиран стек. NavigationStack се препоръчва от Apple за нови проекти.
Чрез модификатора .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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също