NavigationView: basi, stack di navigazione nelle app SwiftUI

Autore: IT Sectr Pubblicato: 2026-02-22 Tempo di lettura: 6 min

NavigationView è un componente contenitore SwiftUI per organizzare la navigazione a stack tra schermate. NavigationView crea uno stack di navigazione con barra di navigazione automatica, titolo e pulsante «Indietro». Da iOS 16, Apple raccomanda l'uso di NavigationStack. Leggi di più nella documentazione Apple.

Punti chiave

  • NavigationView — contenitore SwiftUI per navigazione a stack, crea barra di navigazione e pulsante Indietro
  • NavigationLink — elemento di transizione verso una nuova schermata all'interno di NavigationView
  • NavigationStack — successore di NavigationView (iOS 16+) con gestione programmatica dello stack
  • .toolbar — modificatore per aggiungere pulsanti alla barra di navigazione
  • .navigationTitle — imposta il titolo della schermata in stile large o inline

Cos'è NavigationView?

NavigationView è un contenitore SwiftUI che avvolge una gerarchia di schermate e fornisce un'interfaccia di navigazione. All'interno di NavigationView funziona NavigationLink — un elemento che, quando premuto, sostituisce la schermata corrente con una nuova. NavigationView aggiunge automaticamente una barra di navigazione con titolo e pulsante «Indietro».

NavigationView è apparso in iOS 13 insieme a SwiftUI. Concettualmente sostituisce UINavigationController di UIKit, ma è implementato in modo dichiarativo. Invece di push/pop manuale, lo sviluppatore descrive la relazione tra le schermate tramite NavigationLink. Il sistema gestisce automaticamente lo stack.

NavigationView supporta i modificatori .navigationTitle, .navigationBarTitleDisplayMode, .toolbar e .searchable. Per iOS 16+, Apple ha introdotto NavigationStack, che preserva l'API di NavigationView ma aggiunge la gestione programmatica dello stack tramite NavigationPath. Per i progetti con supporto fino a iOS 15, NavigationView rimane l'unica opzione.

NavigationLink è un elemento SwiftUI che crea una transizione verso una schermata di destinazione all'interno di NavigationView o NavigationStack. Quando si preme NavigationLink, il sistema aggiunge la schermata di destinazione allo stack di navigazione. L'animazione di transizione è il push standard da destra su iOS, adattandosi alla piattaforma.

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

struct DetailView: View {
    let item: Item

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

NavigationLink accetta due parametri: destination — la View di destinazione, e label — l'elemento su cui l'utente preme. Per le liste, la sintassi con value e NavigationLink(value:) è conveniente — deseleziona automaticamente la cella e funziona con NavigationPath.

Con iOS 16, Apple ha presentato NavigationStack come sostituto di NavigationView. NavigationStack preserva la sintassi dichiarativa ma aggiunge una funzionalità criticamente importante — la gestione programmatica dello stack tramite la proprietà path di tipo NavigationPath o un array di Hashable.

FunzionalitàNavigationView (iOS 13-15)NavigationStack (iOS 16+)
Push programmaticoNo, solo tramite NavigationLinkSì, tramite path.append(value)
popToRootSolo dismiss fino alla radicepath.removeLast(path.count)
Deep LinksImplementazione complessaSupporto integrato tramite path
Tipizzazione stackNo (qualsiasi View in destination)Sì (array di valori Hashable)
SplitView iPadColumnStyle / StackStyleNavigationSplitView (iOS 16+)

Per progetti con versione minima iOS 16+, usa NavigationStack. Per supporto iOS 14-15 — NavigationView. NavigationStack non ha analoghi diretti per le versioni precedenti, quindi l'aggiornamento richiede una verifica di compatibilità.

Toolbar e configurazione di navigationTitle

I modificatori .toolbar e .navigationTitle controllano il contenuto della barra di navigazione. .navigationTitle imposta il titolo della schermata, .navigationBarTitleDisplayMode seleziona lo stile: .large (grande, predefinito) o .inline (compatto, come in Impostazioni). .toolbar aggiunge pulsanti, ricerca e controllo segmentato.

swift
struct SettingsView: View {
    var body: some View {
        NavigationStack {
            Form {
                Section("Profilo") {
                    Text("Nome utente")
                    Toggle("Notifiche", isOn: $notifications)
                }
            }
            .navigationTitle("Impostazioni")
            .navigationBarTitleDisplayMode(.large)
            .toolbar {
                ToolbarItem(placement: .navigationBarTrailing) {
                    Button("Salva") { save() }
                }
                ToolbarItem(placement: .navigationBarLeading) {
                    EditButton()
                }
            }
        }
    }
}

.searchable è un altro modificatore che integra una barra di ricerca nella barra di navigazione. Funziona sia con NavigationView che con NavigationStack. La ricerca si nasconde automaticamente durante lo scorrimento e appare scorrendo verso il basso. Supporta il filtraggio delle liste tramite un Binding String.

Navigazione programmatica con NavigationPath

NavigationPath è un tipo iOS 16+ che rappresenta uno stack di navigazione come una collezione di valori Hashable. Lo sviluppatore aggiunge elementi al path per transizioni programmatiche e li rimuove per tornare indietro. NavigationPath supporta deep link, notifiche push e ripristino dello stato.

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

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

        // Navigazione programmatica tramite deep link
        .onOpenURL { url in
            guard let productId = DeepLinkParser.parse(url) else { return }
            path.append(Product(id: productId))
        }
    }
}

.navigationDestination(for:) registra un tipo di dati per cui mostrare una schermata. Quando un valore di questo tipo viene aggiunto al path, il sistema crea automaticamente la View di destinazione. Questo approccio sostituisce il NavigationLink(destination:) esplicito e rende la navigazione strettamente tipizzata.

NavigationView e NavigationStack funzionano su tutte le piattaforme Apple: iOS, iPadOS, watchOS, tvOS e macOS. Il comportamento si adatta allo schermo. Su iPad, NavigationStack supporta NavigationSplitView, che sostituisce UISplitViewController di UIKit e mostra due colonne su schermo largo.

NavigationSplitView (iOS 16+) divide lo schermo in barra laterale (elenco) e dettaglio. Su iPhone, la barra laterale è nascosta, mostrando solo il dettaglio tramite NavigationLink. Su iPad, la barra laterale e il dettaglio vengono mostrati simultaneamente in modalità 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("Categorie")
        } detail: {
            ProductListView(category: selectedCategory)
        }
    }
}

NavigationSplitView seleziona automaticamente la modalità di visualizzazione ottimale per ogni dispositivo. Su iPhone in verticale — stack, su iPad e iPhone in orizzontale — split. Lo sviluppatore non deve scrivere codice separato per diverse classi di dimensione.

Domande frequenti

Qual è la differenza tra NavigationView e NavigationStack?

NavigationView è la vecchia API (iOS 13-15), supporta solo NavigationLink dichiarativo. NavigationStack è la nuova API (iOS 16+), aggiunge path per navigazione programmatica, deep link e uno stack strettamente tipizzato. Apple raccomanda NavigationStack per i nuovi progetti.

Come aggiungere un pulsante alla barra di navigazione?

Tramite il modificatore .toolbar con ToolbarItem. Ad esempio: .toolbar { ToolbarItem(placement: .navigationBarTrailing) { Button('Impostazioni') { } } }. Placement determina la posizione: trailing (destra), leading (sinistra), principal (centro).

Come configurare il titolo e il suo stile?

Il titolo viene impostato tramite .navigationTitle('Titolo'). Stile — .navigationBarTitleDisplayMode(.large) o .inline. Large — titolo grande in stile iOS Music, inline — compatto, come in Impostazioni. Lo stile può essere cambiato per ogni schermata individualmente.

Come passare dati tramite NavigationLink?

Tre modi: tramite value (NavigationLink(value:item) { Label }, iOS 16+), tramite destination + label, tramite isActive per transizione programmatica. NavigationLink con value è più pulito per le liste poiché non richiede la creazione della View di destinazione prima della transizione.

Si può usare NavigationView su watchOS e tvOS?

Sì. NavigationView e NavigationStack sono disponibili su iOS, iPadOS, watchOS, tvOS e macOS. Su watchOS la navigazione usa la gerarchia di interfaccia con la Digital Crown, su tvOS — input basato sul focus con il telecomando. Il comportamento si adatta automaticamente alla piattaforma.

Riepilogo

  • NavigationView — contenitore SwiftUI per navigazione a stack con barra di navigazione automatica e pulsante Indietro
  • NavigationLink — l'elemento di transizione principale, supporta sintassi dichiarativa (destination) e basata su value
  • NavigationStack (iOS 16+) sostituisce NavigationView, aggiungendo gestione programmatica dello stack tramite NavigationPath
  • .toolbar aggiunge pulsanti alla barra di navigazione, .navigationTitle imposta il titolo con selezione stile large/inline
  • NavigationPath — stack strettamente tipizzato di valori Hashable per navigazione programmatica e deep link
  • NavigationSplitView (iOS 16+) adatta l'interfaccia per iPad e iPhone, scegliendo automaticamente split o stack
  • La scelta tra NavigationView e NavigationStack è determinata dalla versione minima supportata di iOS nel progetto

Svilupperemo un'applicazione mobile chiavi in mano

IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.

Discuti il progetto

Leggi anche