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 — 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.
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.
| Funktion | NavigationView (iOS 13-15) | NavigationStack (iOS 16+) |
|---|---|---|
| Programmatisk push | Nej, endast via NavigationLink | Ja, via path.append(value) |
| popToRoot | Endast dismiss till root | path.removeLast(path.count) |
| Deep Links | Komplex implementering | Inbyggt stöd via path |
| Stacktypning | Nej (vilken View som helst i destination) | Ja (array av Hashable-värden) |
| SplitView iPad | ColumnStyle / StackStyle | NavigationSplitView (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.
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.
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.
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.
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.
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
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.
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).
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.
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.
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
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.
Läs också