NavigationLink — co to je, tlačítko přechodu ve SwiftUI

Autor: IT Sectr Publikováno: 2026-06-25 Doba čtení: 6 min

NavigationLink je ovládací prvek ve SwiftUI určený k přechodu na jinou obrazovku v NavigationStack nebo NavigationView. Podle Apple Developer Documentation, 2024 vytváří NavigationLink tlačítko, po jehož stisknutí je cílové View umístěno do navigačního zásobníku. V iOS 16+ se doporučuje používat NavigationLink s value a NavigationDestination, nikoli přímo s destination, aby se předešlo předčasné inicializaci cílových View.

Hlavní body

  • NavigationLink — tlačítko přechodu na jinou obrazovku ve SwiftUI
  • Dvě formy — s destination:label: a s value:label:
  • Value forma doporučena v iOS 16+ (NavigationStack)
  • Destination forma vede k předčasné inicializaci View
  • Automatická šipka odhalení v seznamech List

NavigationLink je View, které po stisknutí iniciuje navigační přechod. Uvnitř NavigationStack stisknutí NavigationLink umístí cílovou obrazovku do zásobníku a zobrazí systémové tlačítko „Zpět”. NavigationLink existuje od iOS 13 a je hlavním způsobem uživatelské navigace ve SwiftUI.

NavigationLink nedědí z UIButton — je to SwiftUI View, které se automaticky přizpůsobuje kontextu. Uvnitř List se NavigationLink zobrazuje s indikátorem odhalení (disclosure indicator). Mimo seznam se NavigationLink chová jako běžné tlačítko, ale s navigačním chováním.

Podle SwiftUI Lab (2024) je NavigationLink jedním z nejpoužívanějších View ve SwiftUI aplikacích, hned za Text, Image a VStack. Pochopení rozdílů mezi formami inicializace je kritické pro výkon a předvídatelné chování navigace.

Jak NavigationLink funguje pod kapotou

Po stisknutí NavigationLink přidá hodnotu (nebo destination) do navigačního zásobníku spojeného s nejbližším NavigationStack nebo NavigationView. SwiftUI používá EnvironmentValue k předávání cesty navigace přes hierarchii View. NavigationLink tuto cestu čte z Environment a po stisknutí ji upravuje.

NavigationLink má dvě hlavní formy: s destination (přímé uvedení cílového View) a s value (hodnota pro NavigationDestination). Volba formy závisí na verzi iOS a architektuře navigace.

FormaInicializátoriOS 13–15iOS 16+
DestinationNavigationLink(destination:label:)DoporučenoNedoporučeno
ValueNavigationLink(value:label:)NedostupnáDoporučeno
IsActiveNavigationLink(isActive:destination:label:)Programová navigaceNedoporučeno

Destination forma (iOS 13+): NavigationLink(destination: DetailView(), label: { Text(„Open”) }). Tato forma vytváří DetailView okamžitě při renderování NavigationLink, i když uživatel neklikl na odkaz. To vede k předčasné inicializaci View a potenciálním problémům s výkonem, pokud cílové View provádí těžké operace v inicializátoru.

Value forma (iOS 16+): NavigationLink(value: „detail_42”, label: { Text(„Open”) }). Cílové View je vytvořeno pouze při kliknutí na odkaz, když SwiftUI najde odpovídající .navigationDestination. To zabraňuje předčasné inicializaci a činí navigaci předvídatelnější.

NavigationLink s NavigationStack v iOS 16+ vyžaduje přechod na value formu. Definujete typ dat pro navigaci (String, Int, enum Route) a registrujete destination přes .navigationDestination. NavigationLink umístí do zásobníku pouze hodnotu a SwiftUI vytvoří cílové View při kliknutí.

swift
struct CatalogView: View {
    let categories: [String]

    var body: some View {
        List(categories, id: \.self) { category in
            NavigationLink(value: category) {
                Text(category)
            }
        }
        .navigationDestination(for: String.self) { category in
            CategoryView(name: category)
        }
    }
}

// Programová navigace:
struct DeepLinkView: View {
    @State private var path: [AppRoute] = []

    var body: some View {
        NavigationStack(path: $path) {
            HomeView()
                .navigationDestination(for: AppRoute.self) { route in
                    switch route {
                    case .detail(let id): DetailView(id: id)
                    case .settings: SettingsView()
                    }
                }
                .toolbar {
                    Button("Otevřít Nastavení") {
                        path.append(AppRoute.settings)
                    }
                }
        }
    }
}

Programová navigace: přidání hodnoty do path (přes path.append) je ekvivalentní stisknutí NavigationLink se stejnou hodnotou. To umožňuje implementaci navigace z ViewModel, Coordinator nebo jako reakci na push oznámení.

IsActive forma (NavigationLink(isActive:destination:label:)) je dostupná pro kompatibilitu, ale není doporučena v iOS 16+. Použijte value formu s Binding na pole cesty nebo NavigationPath.

NavigationLink v List automaticky zobrazuje šipku odhalení (chevron) v pravé části řádku, signalizující uživateli, že stisknutí povede na jinou obrazovku. List spravuje zobrazení šipky automaticky — na rozdíl od běžného NavigationLink mimo seznam, kde šipka není.

Od iOS 16 List s NavigationLink automaticky používá value formu uvnitř List(data:rowContent:). Při použití ForEach uvnitř List se šipka odhalení také přidává automaticky. Toto chování nelze vypnout modifikátory — pouze nahrazení NavigationLink za Button může šipku odstranit.

Problém s destination formou v List: pokud používáte NavigationLink(destination:label:) uvnitř List, všechna cílová View jsou vytvořena okamžitě při načtení seznamu, bez ohledu na to, zda uživatel klikl na odkaz či nikoli. Pro seznamy s velkým počtem řádků to může výrazně zpomalit počáteční načítání a zvýšit spotřebu paměti. Value forma s NavigationStack tento problém řeší.

Podle WWDC 2022 (Session 10054) Apple doporučuje používat NavigationStack a value formu NavigationLink pro nové projekty. To je zvláště důležité pro List s dynamickými daty, kde počet řádků může být velký.

Vzor 1: vlastní vzhled NavigationLink. NavigationLink přijímá libovolné View jako label, což umožňuje vytvořit libovolný design pro odkaz. Uvnitř List je to obzvláště pohodlné — při použití NavigationLink automaticky získáte šipku odhalení.

swift
NavigationLink(value: ProductRoute.detail(product)) {
    HStack {
        AsyncImage(url: product.imageURL)
            .frame(width: 60, height: 60)
        VStack(alignment: .leading) {
            Text(product.name).font(.headline)
            Text(product.price) .foregroundColor(.secondary)
        }
    }
    .padding(8)
}

Vzor 2: NavigationLink bez šipky (vlastní tlačítko). Pokud nepotřebujete šipku odhalení, použijte Button pro programovou navigaci: path.append(value). To je užitečné pro vlastní prvky rozhraní, kde NavigationLink vypadá nepřirozeně.

Vzor 3: podmíněná navigace. Můžete zablokovat NavigationLink pomocí prázdného destination nebo nepřidáním .navigationDestination pro určité hodnoty. Programová navigace přes path umožňuje kontrolovat podmínky před přidáním hodnoty.

Podle Hacking with Swift (2024) většina problémů s NavigationLink souvisí s použitím destination formy ve starších projektech. Při migraci na NavigationStack nahraďte všechny NavigationLink(destination:label:) za NavigationLink(value:label:) a přidejte .navigationDestination na kořenové úrovni.

Často kladené otázky

Co je NavigationLink ve SwiftUI?

NavigationLink je View pro přechod na jinou obrazovku ve SwiftUI. Po stisknutí umístí cílovou obrazovku do navigačního zásobníku NavigationStack nebo NavigationView. Podporuje dvě formy: s destination (cílové View) a s value (hodnota pro směrování).

Která forma NavigationLink je lepší: destination nebo value?

Value forma (iOS 16+) je výhodnější: cílové View je vytvořeno pouze při kliknutí, ne při renderování odkazu. Destination forma vytváří View okamžitě, což může způsobovat problémy s výkonem. Pro projekty s iOS 16+ používejte value + NavigationDestination.

Proč NavigationLink vytváří šipku v List?

SwiftUI automaticky přidává disclosure indicator (šipku) k NavigationLink uvnitř List, signalizující možnost přechodu. Toto chování nelze vypnout. Pokud šipka není potřeba, použijte Button s programovou navigací přes path.append().

Jak provést programový přechod přes NavigationLink?

Použijte NavigationStack s Binding cesty a přidávejte hodnoty přes path.append(value). To je ekvivalentní stisknutí NavigationLink se stejnou hodnotou. Programová navigace umožňuje implementaci Deeplinků, push oznámení a vzoru Coordinator.

Ovlivňuje NavigationLink výkon?

Destination forma může ovlivnit, pokud cílová View provádějí těžké operace v inicializátoru — všechna destination jsou vytvořena při renderování seznamu. Value forma s NavigationStack tento problém řeší vytvořením View pouze při kliknutí. Pro seznamy s 50+ řádky je rozdíl významný.

Shrnutí

  • NavigationLink — tlačítko pro navigační přechody mezi obrazovkami SwiftUI
  • Value forma doporučena v iOS 16+ s NavigationStack
  • Destination forma vytváří View předčasně — vyhněte se pro velké seznamy
  • Disclosure indicator — automatická šipka v List (nevypíná se)
  • Programová navigace přes path.append() pro Deeplinky a Coordinator
  • NavigationDestination registruje cílové obrazovky podle typů dat
  • IsActive forma — zastaralá, používejte value formu na iOS 16+

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é