Form in SwiftUI is een containercomponent voor het bouwen van gestructureerde interfaces voor instellingen en gegevensinvoer, die het ontwerp van Settings in iOS volgt. Het component groepeert besturingselementen automatisch in secties met systeemafstanden en -stijlen, waardoor de ontwikkelaar geen scheidingslijnen en kleuren handmatig hoeft af te stemmen. Volgens Apple Developer Documentation (2025) past Form het uiterlijk aan elk platform aan — van gegroepeerde tabellen op iOS tot standaard lijsten op macOS — met behoud van één API.
Kernpunten
Form is een gespecialiseerde SwiftUI-container voor het maken van invoerformulieren en instellingenschermen. Het erft het gedrag van List, maar voegt platformstijlen toe: op iOS wordt Form weergegeven als een gegroepeerde tabel met afgeronde hoeken van secties, op macOS als een standaard systeemlijst met selectievakjes en besturingselementen.
In tegenstelling tot handmatige opmaak met VStack en HStack plaatst Form automatisch afstanden tussen elementen, voegt scheidingslijnen toe en past het uiterlijk aan het systeemthema aan — licht of donker. De ontwikkelaar beschrijft alleen de logische structuur: Section voor groepering en de besturingselementen erin. Het formulier beslist zelf hoe Picker, Toggle of Stepper visueel op een specifiek platform wordt geplaatst.
Form ondersteunt alle standaard SwiftUI-invoerelementen: TextField voor tekst, SecureField voor wachtwoorden, Picker voor selectie uit een lijst, Toggle voor aan/uit, Slider voor bereiken, Stepper voor stapsgewijze waarden en DatePicker voor datum. Elk element krijgt automatisch een stijl conform HIG (Human Interface Guidelines) van Apple op het doelplatform.
Ondanks de uiterlijke overeenkomst lossen Form en List verschillende taken op. List is een universele container voor het weergeven van scrollbare datalijsten met de mogelijkheid tot swipe-acties en het bewerken van rijen. Form is een gespecialiseerde container voor gegevensinvoer en instellingen, geoptimaliseerd voor systeemstijlen van besturingselementen.
List is geschikt voor het weergeven van dynamische gegevens: nieuwsfeeds, chats, productcatalogi. Form — voor statische schermen met een voorspelbare set velden: gebruikersprofiel, app-instellingen, registratieformulier. Het belangrijkste verschil: elementen van Form kunnen interactieve besturingselementen zijn, terwijl rijen van List meestal gegevens weergeven en op een tik reageren met navigatie of een actie.
| Parameter | Form | List |
|---|---|---|
| Doel | Gegevensinvoer, instellingen | Weergave van lijsten |
| Stijl van secties | Grouped (iOS), systeem (macOS) | Plain of Grouped |
| Besturingselementen | Picker, Toggle, Slider, Stepper | Beperkt (knop) |
| Dynamische gegevens | Beperkt (ForEach binnen Section) | Volledige ondersteuning |
| Swipe-acties | Ja, swipeActions | Ja, swipeActions |
Volgens Apple Human Interface Guidelines (2025) moet Form worden gebruikt voor instellingen- en invoerschermen, waar zich op één scherm 3 tot 20 besturingselementen bevinden en de indeling in secties de perceptie verbetert.
Section is het belangrijkste bouwblok van Form, waarmee logisch gerelateerde elementen kunnen worden gegroepeerd. Elke Section kan een kop, een voettekst en een willekeurig aantal besturingselementen bevatten. Het systeem voegt automatisch afstanden tussen secties toe en wikkelt elke sectie in een visueel blok met afgeronde hoeken.
Het gebruik van Section is cruciaal voor de leesbaarheid van het formulier: elementen die op betekenis zijn gegroepeerd, worden door de gebruiker gemakkelijker waargenomen. Op het profielinstellingenscherm kan men bijvoorbeeld aparte secties „Persoonlijke gegevens", „Meldingen" en „Beveiliging" maken. Elke sectie kan een voettekst met verklarende tekst bevatten, die het systeem in een kleiner lettertype onder de groep elementen weergeeft.
Form {
Section(header: Text("Profiel")) {
TextField("Naam", text: $name)
TextField("Email", text: $email)
}
Section(header: Text("Meldingen"),
footer: Text("Uitschakelen tijdens vergaderingen")) {
Toggle("Push notifications", isOn: $pushEnabled)
Toggle("Email notifications", isOn: $emailEnabled)
}
}
In het voorbeeld bevat de eerste sectie „Profile" twee tekstvelden zonder voettekst, de tweede sectie „Notifications" twee schakelaars met een uitleg onder de groep. De voettekst voegt automatisch een afstand toe en gebruikt de caption-lettertypestijl. Section kan een voettekst zonder kop of een kop zonder voettekst bevatten.
Form ondersteunt alle standaard SwiftUI-invoerelementen. Picker in Form wordt op iOS automatisch weergegeven als een navigatieregel met doorgang naar een apart selectiescherm. Toggle wordt weergegeven als een regel met een schakelaar die rechts is uitgelijnd. TextField krijgt de systeemstijl voor invoer met een placeholder.
Voor numerieke waarden worden Stepper (stapsgewijze wijziging) en Slider (geleidelijke wijziging in een bereik) gebruikt. DatePicker ondersteunt meerdere modi: date, time, dateAndTime. Voor kleurselectie is ColorPicker beschikbaar. Elk element past zich zonder extra code aan het platform aan — op iOS gebruiken besturingselementen de native UIKit-stijlen, op macOS AppKit.
| Element | Doel | Stijl in Form |
|---|---|---|
| TextField | Tekstinvoer | Regel met placeholder |
| SecureField | Wachtwoordinvoer | Regel met verborgen tekens |
| Picker | Selectie uit lijst | NavigationLink naar het selectiescherm |
| Toggle | Aan/Uit | Regel met schakelaar |
| Slider | Waardenbereik | Horizontale schuifregelaar |
| DatePicker | Datum/tijd selecteren | Compacte of wielstijl |
Voor aangepaste besturingselementen binnen Form kunnen alle SwiftUI Views worden gebruikt — ze erven het standaardgedrag van de sectie. Het wordt echter aanbevolen bij systeemelementen te blijven, omdat ze conformiteit met HIG garanderen en Accessibility (VoiceOver, Dynamic Type) ondersteunen zonder extra configuratie.
Laten we het maken van een registratiescherm met Form bekijken. Het formulier bevat vier secties: persoonlijke gegevens, rolselectie, abonnementsinstellingen en een verzendknop. Section wordt gebruikt voor groepering en de standaard SwiftUI-besturingselementen.
struct RegistrationForm: View {
@State private var name = ""
@State private var email = ""
@State private var role = "Developer"
@State private var agreedToTerms = false
let roles = ["Developer", "Designer", "Manager"]
var body: some View {
NavigationStack {
Form {
Section(header: Text("Persoonlijke gegevens")) {
TextField("Name", text: $name)
TextField("Email", text: $email)
.keyboardType(.emailAddress)
}
Section(header: Text("Rol")) {
Picker("Select role", selection: $role) {
ForEach(roles, id: \.self) { role in
Text(role).tag(role)
}
}
}
Section {
Toggle("Agree to terms", isOn: $agreedToTerms)
}
Section {
Button("Registreren") {
submitForm()
}
.disabled(!agreedToTerms)
}
}
.navigationTitle("Registration")
}
}
private func submitForm() { }
}
Het formulier is verdeeld in vier Section: persoonlijke gegevens met twee tekstvelden, rolselectie via Picker, akkoord met de voorwaarden via Toggle en de registratieknop. De knop is uitgeschakeld totdat de gebruiker akkoord gaat met de voorwaarden — dit is een voorbeeld van validatie binnen Form. NavigationStack voegt een titel toe en stelt Picker in staat op iOS een apart selectiescherm te openen.
struct SettingsForm: View {
@State private var volume: Double = 0.5
@State private var isDarkMode = false
@State private var reminderDate = Date()
var body: some View {
NavigationStack {
Form {
Section(header: Text("Weergave")) {
Toggle("Dark mode", isOn: $isDarkMode)
Slider(value: $volume, in: 0...1) {
Text("Volume")
}
}
Section(header: Text("Herinneringen"),
footer: Text("U ontvangt een melding op het geselecteerde tijdstip")) {
DatePicker("Remind at",
selection: $reminderDate,
displayedComponents: .hourAndMinute)
}
Section {
NavigationLink("Advanced Settings",
destination: AdvancedSettingsView())
}
}
.navigationTitle("Settings")
}
}
}
Dit voorbeeld toont de combinatie van Slider, DatePicker en NavigationLink binnen Form. DatePicker gebruikt de modus hourAndMinute om alleen de tijd weer te geven. NavigationLink in de laatste sectie creëert een doorgang naar het scherm voor geavanceerde instellingen — een veelgebruikt patroon voor Settings-achtige interfaces. De koppen en voetteksten van secties maken het formulier zelfdocumenterend: de gebruiker begrijpt meteen bij welke groep elk besturingselement hoort.
Veelgestelde vragen
Form is geoptimaliseerd voor gegevensinvoer en instellingen: besturingselementen krijgen systeemstijlen, secties afgeronde hoeken en afstanden. List is een universele container voor de weergave van gegevens. Form is geschikt voor instellingenschermen, List — voor chats, feeds, catalogi.
Ja, Picker binnen Form wordt op iOS automatisch weergegeven als een regel met de geselecteerde waarde en een NavigationLink voor selectie uit een lijst. Op macOS wordt Picker weergegeven als een vervolgkeuzelijst of radiogroep, afhankelijk van de stijl. De aanpassing vindt plaats zonder extra code.
Elke SwiftUI View kan binnen Form of Section worden geplaatst. Voor aangepaste besturingselementen wordt aanbevolen de standaardafstanden van de sectie te erven en Dynamic Type via systeemlettertypen te ondersteunen. Vermijd vaste afmetingen en kleuren, zodat het formulier correct op alle apparaten wordt weergegeven.
Ja, Form wordt automatisch in een ScrollView gewikkeld als de inhoud de schermhoogte overschrijdt. Het is niet nodig ScrollView handmatig toe te voegen — het systeem bepaalt zelf of scrollen nodig is. Gebruik voor formulieren die niet mogen scrollen VStack met een vaste hoogte.
Form ondersteunt op iOS twee stijlen via de modifier .formStyle(.grouped) — de standaard gegroepeerde weergave met afgeronde secties. Voor macOS is .formStyle(.columns) beschikbaar met een meerkolomsindeling. De stijl wordt in één keer op de hele Form toegepast en verandert de visuele weergave van alle elementen erin.
Conclusie
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook