NavigationView: grunder, navigationsstack i SwiftUI-applikationer

Författare: IT Sectr Publicerad: 2026-02-22 Lästid: 6 min

NavigationView — en containerkomponent i SwiftUI för att organisera stacknavigering mellan skärmar. NavigationView skapar en navigationsstack med automatiskt fält, titel och «Tillbaka»-knapp. Från och med iOS 16 rekommenderar Apple att använda NavigationStack. Läs mer i Apples dokumentation.

Huvudpunkter

  • NavigationView — SwiftUI-container för stacknavigering, skapar navigation bar och tillbaka-knapp
  • NavigationLink — element för övergång till ny skärm inuti NavigationView
  • NavigationStack — efterträdare till NavigationView (iOS 16+) med programmatisk stackhantering
  • .toolbar — modifierare för att lägga till knappar i navigation bar
  • .navigationTitle — ställer in skärmtiteln i large eller inline-stil

Vad är NavigationView?

NavigationView — en SwiftUI-container som omsluter en hierarki av skärmar och tillhandahåller ett navigeringsgränssnitt. Inuti NavigationView fungerar NavigationLink — ett element som vid tryckning ersätter den aktuella skärmen med en ny. NavigationView lägger automatiskt till navigation bar med titel och «Tillbaka»-knapp.

NavigationView dök upp i iOS 13 tillsammans med SwiftUI. Konceptuellt ersätter det UINavigationController från UIKit, men är implementerat deklarativt. Istället för manuell push/pop beskriver utvecklaren kopplingen mellan skärmar via NavigationLink. Systemet hanterar automatiskt stacken.

NavigationView stöder modifierarna .navigationTitle, .navigationBarTitleDisplayMode, .toolbar och .searchable. För iOS 16+ introducerade Apple NavigationStack, som behåller NavigationView API men lägger till programmatisk stackhantering via NavigationPath. För projekt som stöder iOS 15 och äldre förblir NavigationView det enda alternativet.

NavigationLink — ett SwiftUI-element som skapar en övergång till målgsskärmen inuti NavigationView eller NavigationStack. När NavigationLink trycks lägger systemet till målgsskärmen i navigationsstacken. Övergångsanimationen — standard push från höger för iOS, anpassas till plattformen.

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

struct DetailView: View {
    let item: Item

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

NavigationLink tar två parametrar: destination — mål-View, och label — elementet som användaren klickar på. För listor är syntaxen med value och NavigationLink(value:) bekväm, som automatiskt avmarkerar cellen och fungerar med NavigationPath.

Från och med iOS 16 introducerade Apple NavigationStack som ersättning för NavigationView. NavigationStack behåller den deklarativa syntaxen men lägger till en kritisk funktion — programmatisk stackhantering via egenskapen path av typen NavigationPath eller en array av Hashable.

FunktionNavigationView (iOS 13-15)NavigationStack (iOS 16+)
Programmatisk pushNej, endast via NavigationLinkJa, via path.append(value)
popToRootEndast dismiss till rootpath.removeLast(path.count)
Deep LinksKomplex implementeringInbyggt stöd via path
StacktypningNej (vilken View som helst i destination)Ja (array av Hashable-värden)
SplitView iPadColumnStyle / StackStyleNavigationSplitView (iOS 16+)

För projekt med minsta iOS 16+ version använd NavigationStack. För stöd av iOS 14-15 — NavigationView. NavigationStack har inga direkta motsvarigheter för gamla versioner, så uppgradering kräver kompatibilitetskontroll.

Toolbar och konfiguration av navigationTitle

Modifierarna .toolbar och .navigationTitle hanterar innehållet i navigeringsfältet. .navigationTitle ställer in skärmtiteln, .navigationBarTitleDisplayMode väljer stil: .large (stor, standard) eller .inline (kompakt, som i Inställningar). .toolbar lägger till knappar, sökning och segmenterad kontroll.

swift
struct SettingsView: View {
    var body: some View {
        NavigationStack {
            Form {
                Section("Profil") {
                    Text("Användarnamn")
                    Toggle("Aviseringar", isOn: $notifications)
                }
            }
            .navigationTitle("Inställningar")
            .navigationBarTitleDisplayMode(.large)
            .toolbar {
                ToolbarItem(placement: .navigationBarTrailing) {
                    Button("Spara") { save() }
                }
                ToolbarItem(placement: .navigationBarLeading) {
                    EditButton()
                }
            }
        }
    }
}

.searchable — ytterligare en modifierare som integrerar sökfältet i navigation bar. Fungerar både med NavigationView och NavigationStack. Sökningen döljs automatiskt vid scrollning och visas vid svep nedåt. Stöder listfiltrering via Binding String.

Programmatisk navigering med NavigationPath

NavigationPath — en iOS 16+ typ som representerar navigationsstacken som en samling Hashable-värden. Utvecklaren lägger till element i path för programmatisk övergång, tar bort dem för återgång. NavigationPath stöder djupa länkar, push-aviseringar och återställning av tillstånd.

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

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

        // Programmatisk övergång via deep link
        .onOpenURL { url in
            guard let productId = DeepLinkParser.parse(url) else { return }
            path.append(Product(id: productId))
        }
    }
}

.navigationDestination(for:) registrerar datatypen för vilken en skärm ska visas. När ett värde av denna typ läggs till i path skapar systemet automatiskt mål-View. Detta tillvägagångssätt ersätter explicit NavigationLink(destination:) och gör navigeringen strikt typad.

NavigationView och NavigationStack fungerar på alla Apple-plattformar: iOS, iPadOS, watchOS, tvOS och macOS. Beteendet anpassar sig till skärmen. På iPad stöder NavigationStack NavigationSplitView, som ersätter UISplitViewController från UIKit och visar två kolumner på bred skärm.

NavigationSplitView (iOS 16+) delar skärmen i sidebar (lista) och detail (detaljer). På iPhone är sidebar dold och visar endast detail via NavigationLink. På iPad visas sidebar och detail samtidigt i split-läge.

swift
struct AdaptiveNavigation: View {
    @State private var selectedCategory: Category?

    var body: some View {
        NavigationSplitView {
            List(categories, selection: $selectedCategory) { category in
                Text(category.name)
            }
            .navigationTitle("Kategorier")
        } detail: {
            ProductListView(category: selectedCategory)
        }
    }
}

NavigationSplitView väljer automatiskt det optimala visningsläget för varje enhet. På iPhone i porträttläge — stack, på iPad och iPhone i landskapsläge — split. Utvecklaren behöver inte skriva separat kod för olika size classer.

Vanliga frågor

Vad är skillnaden mellan NavigationView och NavigationStack?

NavigationView — gammalt API (iOS 13-15), stöder endast deklarativa NavigationLink. NavigationStack — nytt API (iOS 16+), lägger till path för programmatisk navigering, djupa länkar och strikt typad stack. NavigationStack rekommenderas av Apple för nya projekt.

Hur lägger jag till en knapp i navigationBar?

Via modifieraren .toolbar med ToolbarItem. Till exempel: .toolbar { ToolbarItem(placement: .navigationBarTrailing) { Button('Inställningar') { } } }. Placement bestämmer positionen: trailing (höger), leading (vänster), principal (mitten).

Hur ställer jag in titeln och dess stil?

Titeln ställs in via .navigationTitle('Namn'). Stil — .navigationBarTitleDisplayMode(.large) eller .inline. Large — stor titel i iOS Music-stil, inline — kompakt, som i Inställningar. Stilen kan ändras för varje skärm separat.

Hur överför jag data via NavigationLink?

Tre sätt: via value (NavigationLink(value:item) { Label }, iOS 16+), via destination + label, via isActive för programmatisk övergång. NavigationLink med value är renare för listor eftersom det inte kräver att mål-View skapas före övergången.

Kan jag använda NavigationView på watchOS och tvOS?

Ja. NavigationView och NavigationStack finns på iOS, iPadOS, watchOS, tvOS och macOS. På watchOS använder navigering gränssnittshierarkin med Digital Crown-hjulet, på tvOS — fokusinmatning från fjärrkontrollen. Beteendet anpassar sig automatiskt till plattformen.

Sammanfattning

  • NavigationView — SwiftUI-container för stacknavigering med automatiskt navigation bar och «Tillbaka»-knapp
  • NavigationLink — huvudelement för övergång, stöder deklarativ (destination) och value-baserad syntax
  • NavigationStack (iOS 16+) ersätter NavigationView och lägger till programmatisk stackhantering via NavigationPath
  • .toolbar lägger till knappar i navigation bar, .navigationTitle ställer in titel med val av large/inline-stil
  • NavigationPath — strikt typad stack av Hashable-värden för programmatisk navigering och deep links
  • NavigationSplitView (iOS 16+) anpassar gränssnittet för iPad och iPhone, väljer automatiskt split eller stack
  • Valet mellan NavigationView och NavigationStack bestäms av den lägsta iOS-version som stöds i projektet

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också