NavigationView: основи, стек на навигация в SwiftUI приложения

Автор: IT Sectr Публикувано: 2026-02-22 Време за четене: 6 мин

NavigationView — контейнерен компонент на SwiftUI за организиране на стекова навигация между екрани. NavigationView създава навигационен стек с автоматичен панел, заглавие и бутон «Назад». От iOS 16 нататък Apple препоръчва използването на NavigationStack. Прочетете повече в документацията на Apple.

Основни точки

  • NavigationView — контейнер на SwiftUI за стекова навигация, създава navigation bar и бутон назад
  • NavigationLink — елемент за преход към нов екран вътре в NavigationView
  • NavigationStack — наследник на NavigationView (iOS 16+) с програмно управление на стека
  • .toolbar — модификатор за добавяне на бутони в navigation bar
  • .navigationTitle — задава заглавието на екрана в стил large или inline

Какво е NavigationView?

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, адаптира се към платформата.

swift
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 до rootpath.removeLast(path.count)
Deep LinksСложна имплементацияВградена поддръжка чрез path
Типизация на стекаНе (произволен View в destination)Да (масив от Hashable стойности)
SplitView iPadColumnStyle / StackStyleNavigationSplitView (iOS 16+)

За проекти с минимална версия iOS 16+ използвайте NavigationStack. За поддръжка на iOS 14-15 — NavigationView. NavigationStack няма директни аналози за старите версии, така че ъпгрейдът изисква проверка на съвместимостта.

Toolbar и настройка на navigationTitle

Модификаторите .toolbar и .navigationTitle управляват съдържанието на навигационния панел. .navigationTitle задава заглавието на екрана, .navigationBarTitleDisplayMode избира стил: .large (голям, по подразбиране) или .inline (компактен, като в Настройки). .toolbar добавя бутони, търсене и сегментиран контрол.

swift
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

NavigationPath — тип iOS 16+, който представя навигационния стек като колекция от Hashable стойности. Разработчикът добавя елементи в path за програмен преход, премахва ги за връщане. NavigationPath поддържа дълбоки връзки, push известия и възстановяване на състояние.

swift
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 режим.

swift
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 и NavigationStack?

NavigationView — старо API (iOS 13-15), поддържа само декларативни NavigationLink. NavigationStack — ново API (iOS 16+), добавя path за програмна навигация, дълбоки връзки и строго типизиран стек. NavigationStack се препоръчва от Apple за нови проекти.

Как да добавя бутон в navigationBar?

Чрез модификатора .toolbar с ToolbarItem. Например: .toolbar { ToolbarItem(placement: .navigationBarTrailing) { Button('Настройки') { } } }. Placement определя позицията: trailing (вдясно), leading (вляво), principal (център).

Как да настроя заглавието и неговия стил?

Заглавието се задава чрез .navigationTitle('Име'). Стил — .navigationBarTitleDisplayMode(.large) или .inline. Large — голямо заглавие в стил iOS Music, inline — компактно, като в Настройки. Стилът може да се променя за всеки екран поотделно.

Как да предам данни чрез NavigationLink?

Три начина: чрез value (NavigationLink(value:item) { Label }, iOS 16+), чрез destination + label, чрез isActive за програмен преход. NavigationLink с value е по-чист за списъци, тъй като не изисква създаване на целеви View преди прехода.

Може ли да се използва NavigationView на watchOS и tvOS?

Да. NavigationView и NavigationStack са достъпни на iOS, iPadOS, watchOS, tvOS и macOS. На watchOS навигацията използва йерархия на интерфейса с колелото Digital Crown, на tvOS — фокусен вход от дистанционното. Поведението автоматично се адаптира към платформата.

Резюме

  • NavigationView — контейнер на SwiftUI за стекова навигация с автоматичен navigation bar и бутон «Назад»
  • NavigationLink — основен елемент за преход, поддържа декларативен (destination) и value-based синтаксис
  • NavigationStack (iOS 16+) замества NavigationView, добавяйки програмно управление на стека чрез NavigationPath
  • .toolbar добавя бутони в navigation bar, .navigationTitle задава заглавие с избор на стил large/inline
  • NavigationPath — строго типизиран стек от Hashable стойности за програмна навигация и deep links
  • NavigationSplitView (iOS 16+) адаптира интерфейса за iPad и iPhone, автоматично избирайки split или стек
  • Изборът между NavigationView и NavigationStack се определя от минималната поддържана версия на iOS в проекта

Ще разработим мобилно приложение под ключ

IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също