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-у у landscape режиму — 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. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође