Section dans SwiftUI : qu'est-ce que c'est, créer des sections et regrouper

Auteur : IT Sectr Publié le : 2026-06-25 Temps de lecture : 7 min

Section dans SwiftUI est un composant conteneur pour regrouper logiquement des éléments à l'intérieur de Form ou List. Il affiche le contenu sous forme de bloc visuel avec un espacement système, des coins arrondis et un en-tête et un pied de page facultatifs. Selon la Documentation Apple Developer (2025), Section ne gère pas les données, elle organise seulement la présentation : tous les éléments enfants héritent de son style et de son espacement, assurant un affichage structuré des formulaires et des listes.

Points clés

  • Section — un conteneur pour le regroupement logique d'éléments dans Form et List
  • L'en-tête de Section s'affiche au-dessus du groupe en police système
  • Le pied de page ajoute un texte explicatif sous le groupe en police plus petite
  • ForEach dans Section permet de créer des groupes dynamiques
  • Les sections imbriquées sont prises en charge pour l'organisation hiérarchique du contenu

Qu'est-ce que Section dans SwiftUI ?

Section est un composant structurel de SwiftUI conçu pour regrouper des éléments dans les conteneurs Form et List. Contrairement à VStack ou HStack, Section ajoute un espacement système, un en-tête et un pied de page, ainsi qu'un surlignage visuel du groupe sous forme de bloc aux coins arrondis sur iOS.

Section ne modifie pas le comportement des éléments enfants — elle organise seulement leur présentation. Tous les contrôles dans Section — Picker, Toggle, TextField — fonctionnent normalement, mais sont visuellement combinés en un groupe logique. C'est particulièrement important pour les formulaires à l'écran où l'utilisateur doit s'orienter rapidement dans la structure de saisie des données.

Le système gère automatiquement l'espacement entre les sections : la distance entre les Sections sur iOS est de 16–20 points, entre les éléments dans une Section est de 0 (séparateur entre les lignes). Le développeur ne peut pas modifier ces espacements via les modificateurs padding — ils sont contrôlés par le système pour garantir une apparence uniforme.

Section accepte deux paramètres facultatifs : header — le titre du groupe, et footer — le texte explicatif sous le groupe. L'en-tête s'affiche au-dessus des éléments de la section en gras avec un style de légende, le pied de page en police plus petite en gris. Les deux paramètres acceptent n'importe quelle SwiftUI View, pas seulement Text.

L'en-tête de Section aide l'utilisateur à comprendre à quelle catégorie appartiennent les éléments du groupe. Par exemple, sur un écran de paramètres, des en-têtes comme « Notifications », « Confidentialité » et « Compte » orientent instantanément l'utilisateur. Le pied de page est utile pour les explications : « Désactivez les notifications pendant les réunions » ou « Le mot de passe doit contenir au moins 8 caractères. » Le pied de page se répartit automatiquement sur plusieurs lignes si nécessaire.

swift
Section(
    header: Text("Account Security"),
    footer: Text("Use a strong password with at least 8 characters.")
) {
    SecureField("Current password", text: $currentPassword)
    SecureField("New password", text: $newPassword)
}

Dans l'exemple, Section a l'en-tête « Account Security » et un pied de page avec des conseils de sécurité de mot de passe. L'utilisateur voit l'en-tête comme étiquette de section, remplit deux champs et lit immédiatement l'avertissement en dessous. Cette structure améliore l'UX car toutes les informations sur la section sont sur un seul écran sans avoir à naviguer vers une aide séparée.

Section dans Form et List

Section fonctionne à la fois dans Form et dans List, mais la représentation visuelle diffère. Dans Form, Section s'affiche comme un bloc avec des coins arrondis et un fond système, séparé des sections adjacentes par un espacement. Dans List, Section peut utiliser le style plain — sans fond ni coins arrondis, ou inset-grouped — avec des blocs arrondis similaires à Form.

Le choix du conteneur affecte le style de Section. Si vous placez une Section avec le même contenu dans Form et List avec le style .insetGrouped, le résultat sera identique. Cependant, Form ajoute un espacement système et utilise le style grouped par défaut, tandis que List nécessite une spécification explicite du style via le modificateur .listStyle(.insetGrouped).

ConteneurSection par défautStyles disponibles
FormInsetGrouped avec coins arrondis.grouped (Form uniquement)
ListPlain — pas de fond de section.plain, .inset, .insetGrouped, .sidebar

Pour obtenir la même apparence dans List, utilisez .listStyle(.insetGrouped). Ce style imite l'apparence de Form et convient aux écrans de paramètres construits sur List. Pour les listes de données standard, utilisez .plain — sans surlignage de section, avec des séparateurs fins entre les lignes.

Contenu dynamique avec ForEach

Section peut contenir un nombre dynamique d'éléments via ForEach. Cela permet de créer des groupes avec des éléments répétés tout en conservant l'en-tête et le pied de page pour l'ensemble du groupe. ForEach dans Section itère sur une collection de données et crée des Views enfants pour chaque élément sans casser la structure de la section.

Les sections dynamiques sont utiles pour les écrans de paramètres avec un nombre variable d'options : liste des langues disponibles, appareils connectés ou abonnements push. L'en-tête de la section reste statique tandis que le contenu change selon les données.

swift
struct DynamicSectionView: View {
    let categories = ["Work", "Personal", "Finance", "Health"]
    @State private var selected = Set<String>()

    var body: some View {
        Form {
            Section(header: Text("Categories"),
                    footer: Text("Select your preferred categories")) {
                ForEach(categories, id: \.self) { category in
                    Toggle(category, isOn: Binding(
                        get: { selected.contains(category) },
                        set: { if $0 { selected.insert(category) }
                                     else { selected.remove(category) } }
                    ))
                }
            }

            Section {
                Text("Selected: \(selected.count) categories")
                    .foregroundStyle(.secondary)
            }
        }
    }
}

Dans cet exemple, ForEach génère un Toggle pour chaque catégorie du tableau categories. L'en-tête et le pied de page de la section sont définis une fois et s'appliquent à l'ensemble du groupe. La deuxième section affiche le nombre de catégories sélectionnées — elle ne dépend pas de ForEach et reste statique. Cette approche permet de créer des formulaires flexibles où l'en-tête et le pied de page contextualisent un groupe d'éléments dynamiques.

Exemples de code Section

Examinons un exemple complet d'écran de profil utilisant Section pour regrouper des données. Le formulaire contient trois sections : informations utilisateur, paramètres de confidentialité et statistiques. Chaque section utilise son propre en-tête, et la dernière a un pied de page avec des informations récapitulatives.

swift
struct ProfileView: View {
    @State private var displayName = "Alex Johnson"
    @State private var bio = "iOS developer"
    @State private var isProfilePublic = true
    @State private var showEmail = false

    var body: some View {
        Form {
            Section(header: Text("Profile Info")) {
                TextField("Display name", text: $displayName)
                TextField("Bio", text: $bio, axis: .vertical)
                    .lineLimit(3)
            }

            Section(header: Text("Privacy")) {
                Toggle("Public profile", isOn: $isProfilePublic)
                Toggle("Show email", isOn: $showEmail)
                    .disabled(!isProfilePublic)
            }

            Section(header: Text("Stats"),
                    footer: Text("Last updated today at 2:30 PM")) {
                LabeledContent("Posts", value: "42")
                LabeledContent("Followers", value: "1,280")
                LabeledContent("Following", value: "346")
            }
        }
        .navigationTitle("Profile")
    }
}

Trois blocs Section séparent clairement les zones fonctionnelles : champs modifiables du profil, interrupteurs de confidentialité et statistiques. La deuxième section illustre la validation : l'interrupteur « Show email » est désactivé tant que le profil n'est pas public. Le pied de page de la troisième section affiche l'heure de la dernière mise à jour — un exemple d'utilisation du pied de page pour des informations contextuelles supplémentaires. LabeledContent est un composant standard de SwiftUI pour afficher des paires clé-valeur dans Form.

Section avec en-tête personnalisé

swift
Section(
    header: HStack {
        Image(systemName: "bell.fill")
            .foregroundStyle(.blue)
        Text("Notifications")
            .font(.headline)
    },
    footer: Text("Manage push and email alerts")
) {
    Toggle("Push notifications", isOn: $push)
    Toggle("Email notifications", isOn: $email)
    Stepper("Quiet hours: \(quietStart) — \(quietEnd)",
            value: $quietStart,
            in: 0...23)
}

Cet exemple montre que header peut être n'importe quelle SwiftUI View. L'utilisation de HStack avec Image et Text ajoute une icône à côté de l'en-tête, rendant la section visuellement plus expressive. Les en-têtes personnalisés sont utiles pour mettre en évidence des sections importantes dans l'interface : paramètres de notification, fonctions payantes ou sections avec avertissements. Cependant, il n'est pas recommandé d'abuser des en-têtes personnalisés — 1–2 sections avec un style non standard par écran suffisent pour maintenir l'uniformité de l'interface.

Foire aux questions

Peut-on imbriquer une Section dans une autre Section ?

Non, Section ne prend pas en charge l'imbrication dans SwiftUI. Tenter de placer une Section dans une autre Section provoque une erreur de compilation. Pour le regroupement hiérarchique, utilisez List avec OutlineGroup ou DisclosureGroup dans une Section.

Comment modifier l'espacement entre les Sections ?

L'espacement entre les Sections est géré par le système et ne peut pas être modifié via les modificateurs padding. Sur iOS, la distance entre les sections est de 16–20 points et suit les HIG. La seule façon d'affecter l'espacement est d'utiliser un ListStyle personnalisé, mais ce n'est pas recommandé.

Quelle est la différence entre Section et Group dans SwiftUI ?

Group est un conteneur invisible pour regrouper des éléments sans style visuel. Section ajoute un en-tête, un pied de page, un espacement et un bloc visuel. Group est utilisé pour le rendu conditionnel, Section pour structurer l'interface.

Section prend-elle en charge l'accessibilité ?

Oui, Section ajoute automatiquement des étiquettes d'accessibilité. L'en-tête de la section devient un en-tête d'accessibilité du groupe, le pied de page devient une astuce d'accessibilité. VoiceOver lit l'en-tête avant d'entrer dans la section, améliorant la navigation pour les utilisateurs handicapés.

Peut-on utiliser Section sans Form ou List ?

Non, Section fonctionne uniquement dans Form ou List. Utiliser Section en dehors de ces conteneurs provoque une erreur de compilation. Pour regrouper des éléments dans VStack ou ScrollView, utilisez Group ou des Views personnalisées avec une configuration manuelle de l'espacement.

Résumé

  • Section — un conteneur pour regrouper des éléments dans Form et List avec espacement système
  • Header et footer — paramètres facultatifs pour des informations contextuelles sur le groupe
  • ForEach dans Section permet de créer des groupes dynamiques avec des éléments répétés
  • L'imbrication de Section est interdite — utilisez DisclosureGroup pour les sous-groupes
  • Le style de Section dépend du conteneur : Form utilise insetGrouped, List utilise plain par défaut
  • L'en-tête personnalisé peut être n'importe quelle SwiftUI View avec des icônes et des polices personnalisées
  • Utilisez Section pour le regroupement logique des champs de saisie et des paramètres

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