NavigationView: elementele de bază, stiva de navigare în aplicațiile SwiftUI

Autor: IT Sectr Publicat: 2026-02-22 Timp de citire: 6 min

NavigationView — o componentă container SwiftUI pentru organizarea navigării în stivă între ecrane. NavigationView creează o stivă de navigare cu bară automată, titlu și butonul «Înapoi». Începând cu iOS 16, Apple recomandă utilizarea NavigationStack. Citiți mai multe în documentația Apple.

Principalele puncte

  • NavigationView — container SwiftUI pentru navigare în stivă, creează navigation bar și butonul înapoi
  • NavigationLink — element de tranziție către un ecran nou în interiorul NavigationView
  • NavigationStack — succesorul NavigationView (iOS 16+) cu gestionare programatică a stivei
  • .toolbar — modificator pentru adăugarea butoanelor în navigation bar
  • .navigationTitle — setează titlul ecranului în stil large sau inline

Ce este NavigationView?

NavigationView — un container SwiftUI care înfășoară o ierarhie de ecrane și oferă o interfață de navigare. În interiorul NavigationView funcționează NavigationLink — un element care, la apăsare, înlocuiește ecranul curent cu unul nou. NavigationView adaugă automat navigation bar cu titlu și butonul «Înapoi».

NavigationView a apărut în iOS 13 odată cu SwiftUI. Conceptual, înlocuiește UINavigationController din UIKit, dar este implementat declarativ. În loc de push/pop manual, dezvoltatorul descrie legătura dintre ecrane prin NavigationLink. Sistemul gestionează automat stiva.

NavigationView suportă modificatorii .navigationTitle, .navigationBarTitleDisplayMode, .toolbar și .searchable. Pentru iOS 16+, Apple a introdus NavigationStack, care păstrează API-ul NavigationView, dar adaugă gestionarea programatică a stivei prin NavigationPath. Pentru proiectele cu suport iOS 15 și mai vechi, NavigationView rămâne singura opțiune.

NavigationLink — un element SwiftUI care creează o tranziție către ecranul țintă în interiorul NavigationView sau NavigationStack. La apăsarea NavigationLink, sistemul adaugă ecranul țintă în stiva de navigare. Animația tranziției — push standard din dreapta pentru iOS, se adaptează platformei.

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

struct DetailView: View {
    let item: Item

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

NavigationLink primește doi parametri: destination — View-ul țintă, și label — elementul pe care utilizatorul îl apasă. Pentru liste, este convenabilă sintaxa cu value și NavigationLink(value:), care deselectează automat celula și funcționează cu NavigationPath.

Din iOS 16, Apple a prezentat NavigationStack ca înlocuitor pentru NavigationView. NavigationStack păstrează sintaxa declarativă, dar adaugă o capacitate critică — gestionarea programatică a stivei prin proprietatea path de tip NavigationPath sau un tablou Hashable.

CapacitateNavigationView (iOS 13-15)NavigationStack (iOS 16+)
Push programaticNu, doar prin NavigationLinkDa, prin path.append(value)
popToRootDoar dismiss până la rootpath.removeLast(path.count)
Deep LinksImplementare complexăSuport încorporat prin path
Tipizarea stiveiNu (orice View în destination)Da (tablou de valori Hashable)
SplitView iPadColumnStyle / StackStyleNavigationSplitView (iOS 16+)

Pentru proiecte cu versiunea minimă iOS 16+, utilizați NavigationStack. Pentru suport iOS 14-15 — NavigationView. NavigationStack nu are analogi direcți pentru versiunile vechi, deci upgrade-ul necesită verificarea compatibilității.

Toolbar și configurarea navigationTitle

Modificatorii .toolbar și .navigationTitle gestionează conținutul barei de navigare. .navigationTitle setează titlul ecranului, .navigationBarTitleDisplayMode alege stilul: .large (mare, implicit) sau .inline (compact, ca în Setări). .toolbar adaugă butoane, căutare și control segmentat.

swift
struct SettingsView: View {
    var body: some View {
        NavigationStack {
            Form {
                Section("Profil") {
                    Text("Nume utilizator")
                    Toggle("Notificări", isOn: $notifications)
                }
            }
            .navigationTitle("Setări")
            .navigationBarTitleDisplayMode(.large)
            .toolbar {
                ToolbarItem(placement: .navigationBarTrailing) {
                    Button("Salvează") { save() }
                }
                ToolbarItem(placement: .navigationBarLeading) {
                    EditButton()
                }
            }
        }
    }
}

.searchable — un alt modificator care integrează bara de căutare în navigation bar. Funcționează atât cu NavigationView, cât și cu NavigationStack. Căutarea se ascunde automat la derulare și se afișează la glisarea în jos. Suportă filtrarea listei prin Binding String.

Navigare programatică cu NavigationPath

NavigationPath — un tip iOS 16+ care reprezintă stiva de navigare ca o colecție de valori Hashable. Dezvoltatorul adaugă elemente în path pentru tranziția programatică, le elimină pentru revenire. NavigationPath suportă linkuri profunde, notificări push și restaurarea stării.

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

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

        // Tranziție programatică prin deep link
        .onOpenURL { url in
            guard let productId = DeepLinkParser.parse(url) else { return }
            path.append(Product(id: productId))
        }
    }
}

.navigationDestination(for:) înregistrează tipul de date pentru care trebuie afișat un ecran. Când o valoare de acest tip este adăugată în path, sistemul creează automat View-ul țintă. Această abordare înlocuiește NavigationLink(destination:) explicit și face navigarea strict tipizată.

NavigationView și NavigationStack funcționează pe toate platformele Apple: iOS, iPadOS, watchOS, tvOS și macOS. Comportamentul se adaptează la ecran. Pe iPad, NavigationStack suportă NavigationSplitView, care înlocuiește UISplitViewController din UIKit și afișează două coloane pe ecranul lat.

NavigationSplitView (iOS 16+) împarte ecranul în sidebar (listă) și detail (detalii). Pe iPhone, sidebar-ul este ascuns, afișând doar detail prin NavigationLink. Pe iPad, sidebar și detail sunt afișate simultan în modul 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("Categorii")
        } detail: {
            ProductListView(category: selectedCategory)
        }
    }
}

NavigationSplitView alege automat modul optim de afișare pentru fiecare dispozitiv. Pe iPhone în modul portret — stivă, pe iPad și iPhone în landscape — split. Dezvoltatorul nu trebuie să scrie cod separat pentru diferite size class-uri.

Întrebări frecvente

Care este diferența dintre NavigationView și NavigationStack?

NavigationView — API vechi (iOS 13-15), suportă doar NavigationLink declarativ. NavigationStack — API nou (iOS 16+), adaugă path pentru navigare programatică, linkuri profunde și stivă strict tipizată. NavigationStack este recomandat de Apple pentru proiecte noi.

Cum se adaugă un buton în navigationBar?

Prin modificatorul .toolbar cu ToolbarItem. De exemplu: .toolbar { ToolbarItem(placement: .navigationBarTrailing) { Button('Setări') { } } }. Placement determină poziția: trailing (dreapta), leading (stânga), principal (centru).

Cum se configurează titlul și stilul său?

Titlul se setează prin .navigationTitle('Nume'). Stilul — .navigationBarTitleDisplayMode(.large) sau .inline. Large — titlu mare în stilul iOS Music, inline — compact, ca în Setări. Stilul poate fi schimbat pentru fiecare ecran separat.

Cum se transmit date prin NavigationLink?

Trei moduri: prin value (NavigationLink(value:item) { Label }, iOS 16+), prin destination + label, prin isActive pentru tranziție programatică. NavigationLink cu value este mai curat pentru liste, deoarece nu necesită crearea View-ului țintă înainte de tranziție.

Se poate folosi NavigationView pe watchOS și tvOS?

Da. NavigationView și NavigationStack sunt disponibile pe iOS, iPadOS, watchOS, tvOS și macOS. Pe watchOS, navigarea folosește ierarhia interfeței cu roata Digital Crown, pe tvOS — intrarea focalizată de pe telecomandă. Comportamentul se adaptează automat platformei.

Concluzii

  • NavigationView — container SwiftUI pentru navigare în stivă cu navigation bar automat și buton «Înapoi»
  • NavigationLink — element principal de tranziție, suportă sintaxa declarativă (destination) și value-based
  • NavigationStack (iOS 16+) înlocuiește NavigationView, adăugând gestionarea programatică a stivei prin NavigationPath
  • .toolbar adaugă butoane în navigation bar, .navigationTitle setează titlul cu alegerea stilului large/inline
  • NavigationPath — stivă strict tipizată de valori Hashable pentru navigare programatică și deep links
  • NavigationSplitView (iOS 16+) adaptează interfața pentru iPad și iPhone, alegând automat split sau stivă
  • Alegerea între NavigationView și NavigationStack este determinată de versiunea minimă iOS suportată în proiect

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și