NavigationStack - это новый (с iOS 16+) и более мощный способ организации навигации в
SwiftUI. В отличие от
NavigationView, он дает полный контроль над стеком экранов и поддерживает сложные сценарии.
Основные возможности:
- Программное управление стеком экранов (пуш, поп, переход к корню).
- Глубокая навигация по ссылкам (например, app://products/123).
- Кастомные переходы между экранами.
- Поддержка NavigationPath для хетерогенных данных в стеке.
Пример использования:
struct ContentView: View {
@State private var path = NavigationPath()
var body: some View {
NavigationStack(path: $path) {
List {
NavigationLink("Экран 1", value: 1)
NavigationLink("Экран 2", value: "Текст")
}
.navigationDestination(for: Int.self) { value in
Text("Число: \(value)")
}
.navigationDestination(for: String.self) { value in
Text(value)
}
}
}
}
NavigationPath:
Тип-обертка для управления стеком. Может содержать разные типы данных:
path.append(1)
path.append("ABC")
path.removeLast()
navigationDestination(for:)
Определяет, какой экран показывать для каждого типа данных:
.navigationDestination(for: Product.self) { product in
ProductView(product: product)
}
Программная навигация:
Button("Перейти к экрану 3") {
path.append(3)
}
Button("Назад") {
path.removeLast()
}
Button("В корень") {
path.removeLast(path.count)
}
Глубокая навигация:
Можно привязать навигацию к URL:
NavigationStack(path: $path) {
}
.onOpenURL { url in
if url.path == "/products/123" {
path.append(Product(id: 123))
}
}
Рекомендации:
- Для iOS 15 и ниже используйте NavigationView.
- Для модальных окон - sheet или fullScreenCover.
- Не смешивайте NavigationStack и NavigationView.
NavigationStack - это эволюция навигации в
SwiftUI. Он идеален для приложений со сложной навигацией, программного управления историей экранов и лубоких ссылок.