NavigationView: základy, zásobník navigace v aplikacích SwiftUI

Autor: IT Sectr Publikováno: 2026-02-22 Doba čtení: 6 min

NavigationView — kontejnerová komponenta SwiftUI pro organizaci zásobníkové navigace mezi obrazovkami. NavigationView vytváří navigační zásobník s automatickým panelem, nadpisem a tlačítkem «Zpět». Od iOS 16 Apple doporučuje používat NavigationStack. Více si přečtěte v dokumentaci Apple.

Hlavní body

  • NavigationView — kontejner SwiftUI pro zásobníkovou navigaci, vytváří navigation bar a tlačítko zpět
  • NavigationLink — prvek přechodu na novou obrazovku uvnitř NavigationView
  • NavigationStack — nástupce NavigationView (iOS 16+) s programovým řízením zásobníku
  • .toolbar — modifikátor pro přidávání tlačítek do navigation baru
  • .navigationTitle — nastavuje nadpis obrazovky ve stylu large nebo inline

Co je NavigationView?

NavigationView — kontejner SwiftUI, který obaluje hierarchii obrazovek a poskytuje navigační rozhraní. Uvnitř NavigationView funguje NavigationLink — prvek, po jehož stisknutí se aktuální obrazovka nahradí novou. NavigationView automaticky přidává navigation bar s nadpisem a tlačítkem «Zpět».

NavigationView se objevil v iOS 13 spolu se SwiftUI. Koncepčně nahrazuje UINavigationController z UIKit, ale je implementován deklarativně. Místo ručního push/pop vývojář popisuje propojení mezi obrazovkami prostřednictvím NavigationLink. Systém automaticky spravuje zásobník.

NavigationView podporuje modifikátory .navigationTitle, .navigationBarTitleDisplayMode, .toolbar a .searchable. Pro iOS 16+ Apple představil NavigationStack, který zachovává API NavigationView, ale přidává programové řízení zásobníku přes NavigationPath. Pro projekty podporující iOS 15 a starší zůstává NavigationView jedinou možností.

NavigationLink — prvek SwiftUI vytvářející přechod na cílovou obrazovku uvnitř NavigationView nebo NavigationStack. Po stisknutí NavigationLink systém přidá cílovou obrazovku do navigačního zásobníku. Animace přechodu — standardní push zprava pro iOS, přizpůsobuje se platformě.

swift
struct ContentView: View {
    var body: some View {
        NavigationView {
            List(items) { item in
                NavigationLink(destination: DetailView(item: item)) {
                    Text(item.title)
                }
            }
            .navigationTitle("Seznam")
        }
    }
}

struct DetailView: View {
    let item: Item

    var body: some View {
        VStack {
            Text(item.description)
                .navigationTitle(item.title)
                .navigationBarTitleDisplayMode(.inline)
        }
    }
}

NavigationLink přijímá dva parametry: destination — cílové View, a label — prvek, na který uživatel kliká. Pro seznamy je vhodná syntaxe s value a NavigationLink(value:), která automaticky odznačí buňku a pracuje s NavigationPath.

Od iOS 16 Apple představil NavigationStack jako náhradu za NavigationView. NavigationStack zachovává deklarativní syntaxi, ale přidává kriticky důležitou možnost — programové řízení zásobníku prostřednictvím vlastnosti path typu NavigationPath nebo pole Hashable.

MožnostNavigationView (iOS 13-15)NavigationStack (iOS 16+)
Programový pushNe, pouze přes NavigationLinkAno, přes path.append(value)
popToRootPouze dismiss do rootpath.removeLast(path.count)
Deep LinksSložitá implementaceVestavěná podpora přes path
Typizace zásobníkuNe (libovolné View v destination)Ano (pole Hashable hodnot)
SplitView iPadColumnStyle / StackStyleNavigationSplitView (iOS 16+)

Pro projekty s minimální verzí iOS 16+ používejte NavigationStack. Pro podporu iOS 14-15 — NavigationView. NavigationStack nemá přímé analogy pro staré verze, takže upgrade vyžaduje kontrolu kompatibility.

Toolbar a nastavení navigationTitle

Modifikátory .toolbar a .navigationTitle spravují obsah navigačního panelu. .navigationTitle nastavuje nadpis obrazovky, .navigationBarTitleDisplayMode vybírá styl: .large (velký, výchozí) nebo .inline (kompaktní, jako v Nastavení). .toolbar přidává tlačítka, vyhledávání a segmentované ovládání.

swift
struct SettingsView: View {
    var body: some View {
        NavigationStack {
            Form {
                Section("Profil") {
                    Text("Uživatelské jméno")
                    Toggle("Oznámení", isOn: $notifications)
                }
            }
            .navigationTitle("Nastavení")
            .navigationBarTitleDisplayMode(.large)
            .toolbar {
                ToolbarItem(placement: .navigationBarTrailing) {
                    Button("Uložit") { save() }
                }
                ToolbarItem(placement: .navigationBarLeading) {
                    EditButton()
                }
            }
        }
    }
}

.searchable — další modifikátor integrující vyhledávací panel do navigation baru. Funguje jak s NavigationView, tak s NavigationStack. Vyhledávání se automaticky skrývá při rolování a zobrazuje při přejetí dolů. Podporuje filtrování seznamu přes Binding String.

Programová navigace s NavigationPath

NavigationPath — typ iOS 16+, který představuje navigační zásobník jako kolekci Hashable hodnot. Vývojář přidává prvky do path pro programový přechod, odebírá je pro návrat. NavigationPath podporuje hluboké odkazy, push oznámení a obnovení stavu.

swift
struct AppNavigation: View {
    @State private var path = NavigationPath()

    var body: some View {
        NavigationStack(path: $path) {
            List(categories) { category in
                NavigationLink("Kategorie \(category.name)",
                               value: category)
            }
            .navigationTitle("Kategorie")
            .navigationDestination(for: Category.self) { category in
                ProductListView(category: category)
            }
            .navigationDestination(for: Product.self) { product in
                ProductDetailView(product: product)
            }
        }

        // Programový přechod přes deep link
        .onOpenURL { url in
            guard let productId = DeepLinkParser.parse(url) else { return }
            path.append(Product(id: productId))
        }
    }
}

.navigationDestination(for:) registruje datový typ, pro který se má zobrazit obrazovka. Když je do path přidána hodnota tohoto typu, systém automaticky vytvoří cílové View. Tento přístup nahrazuje explicitní NavigationLink(destination:) a činí navigaci striktně typizovanou.

NavigationView a NavigationStack fungují na všech platformách Apple: iOS, iPadOS, watchOS, tvOS a macOS. Chování se přizpůsobuje obrazovce. Na iPadu NavigationStack podporuje NavigationSplitView, který nahrazuje UISplitViewController z UIKit a zobrazuje dva sloupce na široké obrazovce.

NavigationSplitView (iOS 16+) rozděluje obrazovku na sidebar (seznam) a detail (podrobnosti). Na iPhone je sidebar skrytý, zobrazuje se pouze detail přes NavigationLink. Na iPadu se sidebar a detail zobrazují současně v režimu 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("Kategorie")
        } detail: {
            ProductListView(category: selectedCategory)
        }
    }
}

NavigationSplitView automaticky vybírá optimální režim zobrazení pro každé zařízení. Na iPhone v režimu na výšku — zásobník, na iPadu a iPhone v režimu na šířku — split. Vývojář nemusí psát samostatný kód pro různé size classy.

Často kladené otázky

Jaký je rozdíl mezi NavigationView a NavigationStack?

NavigationView — staré API (iOS 13-15), podporuje pouze deklarativní NavigationLink. NavigationStack — nové API (iOS 16+), přidává path pro programovou navigaci, hluboké odkazy a striktně typizovaný zásobník. NavigationStack je doporučen Applem pro nové projekty.

Jak přidat tlačítko do navigationBar?

Přes modifikátor .toolbar s ToolbarItem. Například: .toolbar { ToolbarItem(placement: .navigationBarTrailing) { Button('Nastavení') { } } }. Placement určuje pozici: trailing (vpravo), leading (vlevo), principal (střed).

Jak nastavit nadpis a jeho styl?

Nadpis se nastavuje přes .navigationTitle('Název'). Styl — .navigationBarTitleDisplayMode(.large) nebo .inline. Large — velký nadpis ve stylu iOS Music, inline — kompaktní, jako v Nastavení. Styl lze měnit pro každou obrazovku zvlášť.

Jak předat data přes NavigationLink?

Tři způsoby: přes value (NavigationLink(value:item) { Label }, iOS 16+), přes destination + label, přes isActive pro programový přechod. NavigationLink s value je čistší pro seznamy, protože nevyžaduje vytvoření cílového View před přechodem.

Lze použít NavigationView na watchOS a tvOS?

Ano. NavigationView a NavigationStack jsou dostupné na iOS, iPadOS, watchOS, tvOS a macOS. Na watchOS navigace používá hierarchii rozhraní s kolečkem Digital Crown, na tvOS — fokusový vstup z dálkového ovladače. Chování se automaticky přizpůsobuje platformě.

Shrnutí

  • NavigationView — kontejner SwiftUI pro zásobníkovou navigaci s automatickým navigation barem a tlačítkem «Zpět»
  • NavigationLink — hlavní prvek přechodu, podporuje deklarativní (destination) a value-based syntaxi
  • NavigationStack (iOS 16+) nahrazuje NavigationView a přidává programové řízení zásobníku přes NavigationPath
  • .toolbar přidává tlačítka do navigation baru, .navigationTitle nastavuje nadpis s volbou stylu large/inline
  • NavigationPath — striktně typizovaný zásobník Hashable hodnot pro programovou navigaci a deep links
  • NavigationSplitView (iOS 16+) přizpůsobuje rozhraní pro iPad a iPhone, automaticky volí split nebo zásobník
  • Výběr mezi NavigationView a NavigationStack je určen minimální podporovanou verzí iOS v projektu

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také