NavigationView : bases, pile de navigation dans les apps SwiftUI

Auteur : IT Sectr Publié le : 2026-02-22 Temps de lecture : 6 min

NavigationView est un composant conteneur SwiftUI pour organiser la navigation en pile entre les écrans. NavigationView crée une pile de navigation avec une barre de navigation automatique, un titre et un bouton « Retour ». Depuis iOS 16, Apple recommande d'utiliser NavigationStack. Lisez plus dans la documentation Apple.

Points clés

  • NavigationView — conteneur SwiftUI pour la navigation en pile, crée une barre de navigation et un bouton Retour
  • NavigationLink — élément de transition vers un nouvel écran dans NavigationView
  • NavigationStack — successeur de NavigationView (iOS 16+) avec gestion programmatique de la pile
  • .toolbar — modificateur pour ajouter des boutons à la barre de navigation
  • .navigationTitle — définit le titre de l'écran en style large ou inline

Qu'est-ce que NavigationView ?

NavigationView est un conteneur SwiftUI qui encapsule une hiérarchie d'écrans et fournit une interface de navigation. À l'intérieur de NavigationView fonctionne NavigationLink — un élément qui, lorsqu'on appuie dessus, remplace l'écran actuel par un nouveau. NavigationView ajoute automatiquement une barre de navigation avec un titre et un bouton « Retour ».

NavigationView est apparu avec iOS 13 en même temps que SwiftUI. Conceptuellement, il remplace UINavigationController d'UIKit, mais est implémenté de manière déclarative. Au lieu d'un push/pop manuel, le développeur décrit la relation entre les écrans via NavigationLink. Le système gère automatiquement la pile.

NavigationView prend en charge les modificateurs .navigationTitle, .navigationBarTitleDisplayMode, .toolbar et .searchable. Pour iOS 16+, Apple a introduit NavigationStack, qui préserve l'API de NavigationView mais ajoute une gestion programmatique de la pile via NavigationPath. Pour les projets prenant en charge iOS 15 et inférieur, NavigationView reste la seule option.

NavigationLink est un élément SwiftUI qui crée une transition vers un écran cible dans NavigationView ou NavigationStack. Lorsqu'on appuie sur NavigationLink, le système ajoute l'écran cible à la pile de navigation. L'animation de transition est le push standard depuis la droite sur iOS, s'adaptant à la plateforme.

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

struct DetailView: View {
    let item: Item

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

NavigationLink accepte deux paramètres : destination — la View cible, et label — l'élément sur lequel l'utilisateur appuie. Pour les listes, la syntaxe avec value et NavigationLink(value:) est pratique — elle désélectionne automatiquement la cellule et fonctionne avec NavigationPath.

Avec iOS 16, Apple a présenté NavigationStack comme remplacement de NavigationView. NavigationStack préserve la syntaxe déclarative mais ajoute une fonctionnalité cruciale — la gestion programmatique de la pile via la propriété path de type NavigationPath ou d'un tableau de Hashable.

FonctionnalitéNavigationView (iOS 13-15)NavigationStack (iOS 16+)
Push programmatiqueNon, uniquement via NavigationLinkOui, via path.append(value)
popToRootUniquement dismiss jusqu'à la racinepath.removeLast(path.count)
Deep LinksImplémentation complexeSupport intégré via path
Typage de la pileNon (n'importe quelle View dans destination)Oui (tableau de valeurs Hashable)
SplitView iPadColumnStyle / StackStyleNavigationSplitView (iOS 16+)

Pour les projets avec une version minimale iOS 16+, utilisez NavigationStack. Pour le support iOS 14-15 — NavigationView. NavigationStack n'a pas d'analogues directs pour les anciennes versions, donc la mise à niveau nécessite une vérification de compatibilité.

Toolbar et configuration de navigationTitle

Les modificateurs .toolbar et .navigationTitle contrôlent le contenu de la barre de navigation. .navigationTitle définit le titre de l'écran, .navigationBarTitleDisplayMode sélectionne le style : .large (grand, par défaut) ou .inline (compact, comme dans Réglages). .toolbar ajoute des boutons, la recherche et un contrôle segmenté.

swift
struct SettingsView: View {
    var body: some View {
        NavigationStack {
            Form {
                Section("Profil") {
                    Text("Nom d'utilisateur")
                    Toggle("Notifications", isOn: $notifications)
                }
            }
            .navigationTitle("Réglages")
            .navigationBarTitleDisplayMode(.large)
            .toolbar {
                ToolbarItem(placement: .navigationBarTrailing) {
                    Button("Enregistrer") { save() }
                }
                ToolbarItem(placement: .navigationBarLeading) {
                    EditButton()
                }
            }
        }
    }
}

.searchable est un autre modificateur qui intègre une barre de recherche dans la barre de navigation. Fonctionne aussi bien avec NavigationView qu'avec NavigationStack. La recherche se cache automatiquement au défilement et apparaît en balayant vers le bas. Prend en charge le filtrage de listes via un Binding String.

Navigation programmatique avec NavigationPath

NavigationPath est un type iOS 16+ qui représente une pile de navigation comme une collection de valeurs Hashable. Le développeur ajoute des éléments au path pour les transitions programmatiques et les supprime pour revenir en arrière. NavigationPath prend en charge les deep links, les notifications push et la restauration d'état.

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

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

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

.navigationDestination(for:) enregistre un type de données pour lequel afficher un écran. Lorsqu'une valeur de ce type est ajoutée au path, le système crée automatiquement la View cible. Cette approche remplace le NavigationLink(destination:) explicite et rend la navigation strictement typée.

NavigationView et NavigationStack fonctionnent sur toutes les plateformes Apple : iOS, iPadOS, watchOS, tvOS et macOS. Le comportement s'adapte à l'écran. Sur iPad, NavigationStack prend en charge NavigationSplitView, qui remplace UISplitViewController d'UIKit et affiche deux colonnes sur un écran large.

NavigationSplitView (iOS 16+) divise l'écran en barre latérale (liste) et détail. Sur iPhone, la barre latérale est masquée, affichant uniquement le détail via NavigationLink. Sur iPad, la barre latérale et le détail sont affichés simultanément en mode 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("Catégories")
        } detail: {
            ProductListView(category: selectedCategory)
        }
    }
}

NavigationSplitView sélectionne automatiquement le mode d'affichage optimal pour chaque appareil. Sur iPhone en portrait — pile, sur iPad et iPhone en paysage — split. Le développeur n'a pas besoin d'écrire de code séparé pour différentes classes de taille.

Foire aux questions

Quelle est la différence entre NavigationView et NavigationStack ?

NavigationView est l'ancienne API (iOS 13-15), ne prend en charge que NavigationLink déclaratif. NavigationStack est la nouvelle API (iOS 16+), ajoute path pour la navigation programmatique, les deep links et une pile strictement typée. Apple recommande NavigationStack pour les nouveaux projets.

Comment ajouter un bouton à la barre de navigation ?

Via le modificateur .toolbar avec ToolbarItem. Par exemple : .toolbar { ToolbarItem(placement: .navigationBarTrailing) { Button('Réglages') { } } }. Placement détermine la position : trailing (droite), leading (gauche), principal (centre).

Comment configurer le titre et son style ?

Le titre est défini via .navigationTitle('Titre'). Style — .navigationBarTitleDisplayMode(.large) ou .inline. Large — grand titre style iOS Music, inline — compact, comme dans Réglages. Le style peut être changé pour chaque écran individuellement.

Comment transmettre des données via NavigationLink ?

Trois façons : via value (NavigationLink(value:item) { Label }, iOS 16+), via destination + label, via isActive pour une transition programmatique. NavigationLink avec value est plus propre pour les listes car il ne nécessite pas de créer la View cible avant la transition.

Peut-on utiliser NavigationView sur watchOS et tvOS ?

Oui. NavigationView et NavigationStack sont disponibles sur iOS, iPadOS, watchOS, tvOS et macOS. Sur watchOS, la navigation utilise la hiérarchie d'interface avec la Digital Crown, sur tvOS — une saisie basée sur le focus avec la télécommande. Le comportement s'adapte automatiquement à la plateforme.

Résumé

  • NavigationView — conteneur SwiftUI pour navigation en pile avec barre de navigation automatique et bouton Retour
  • NavigationLink — l'élément de transition principal, prend en charge la syntaxe déclarative (destination) et basée sur value
  • NavigationStack (iOS 16+) remplace NavigationView, ajoutant la gestion programmatique de la pile via NavigationPath
  • .toolbar ajoute des boutons à la barre de navigation, .navigationTitle définit le titre avec sélection de style large/inline
  • NavigationPath — pile strictement typée de valeurs Hashable pour la navigation programmatique et les deep links
  • NavigationSplitView (iOS 16+) adapte l'interface pour iPad et iPhone, choisissant automatiquement split ou pile
  • Le choix entre NavigationView et NavigationStack est déterminé par la version minimale prise en charge d'iOS dans le projet

Nous développerons une application mobile clé en main

IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.

Discuter du projet

Lisez aussi