Form i SwiftUI är en containerkomponent för att bygga strukturerade inställnings- och datainmatningsgränssnitt som följer designen av Settings i iOS. Komponenten grupperar automatiskt kontroller i sektioner med systemavstånd och -stilar, vilket befriar utvecklaren från manuell kalibrering av avgränsare och färger. Enligt Apple Developer Documentation (2025) anpassar Form utseendet till varje plattform — från grupperade tabeller på iOS till standardlistor på macOS — samtidigt som API:n förblir densamma.
Viktigaste punkterna
Form är en specialiserad SwiftUI-container avsedd för att skapa datainmatningsformulär och inställningsskärmar. Den ärver List-beteendet men lägger till plattformsstilar: på iOS visas Form som en grupperad tabell med rundade hörn på sektionerna, på macOS som en standardsystemlista med kryssrutor och kontroller.
Till skillnad från manuell layout med VStack och HStack placerar Form automatiskt ut avstånd mellan element, lägger till avgränsare och anpassar utseendet till systemtemat — ljust eller mörkt. Utvecklaren beskriver bara den logiska strukturen: Section för gruppering och kontrollerna inuti. Formuläret bestämmer själv hur Picker, Toggle eller Stepper ska placeras visuellt på en specifik plattform.
Form stödjer alla standardmässiga SwiftUI-inmatningselement: TextField för text, SecureField för lösenord, Picker för val från lista, Toggle för på/av, Slider för intervall, Stepper för stegvisa värden och DatePicker för datum. Varje element får automatiskt en stil som överensstämmer med HIG (Human Interface Guidelines) från Apple på målplattformen.
Trots den yttre likheten löser Form och List olika uppgifter. List är en universell container för att visa rullbara datalistor med möjlighet till swipe-åtgärder och radredigering. Form är en specialiserad container för datainmatning och inställningar, optimerad för kontrollernas systemstilar.
List passar för att visa dynamiska data: nyhetsflöden, chattar, produktkataloger. Form — för statiska skärmar med en förutsägbar uppsättning fält: användarprofil, appinställningar, registreringsformulär. Den viktigaste skillnaden: Form-elementen kan vara interaktiva kontroller, medan List-raderna oftast visar data och reagerar på tryck med navigering eller en åtgärd.
| Parameter | Form | List |
|---|---|---|
| Ändamål | Datainmatning, inställningar | Visa listor |
| Sektioners stil | Grouped (iOS), system (macOS) | Plain eller Grouped |
| Kontroller | Picker, Toggle, Slider, Stepper | Begränsade (knapp) |
| Dynamiska data | Begränsat (ForEach i Section) | Fullt stöd |
| Swipe-åtgärder | Ja, swipeActions | Ja, swipeActions |
Enligt Apple Human Interface Guidelines (2025) bör Form användas för inställnings- och inmatningsskärmar där det på en skärm finns 3 till 20 kontroller och där indelning i sektioner förbättrar uppfattningen.
Section är Forms huvudsakliga byggsten som gör det möjligt att gruppera logiskt relaterade element. Varje Section kan ha en rubrik, en sidfot och valfritt antal kontroller inuti. Systemet lägger automatiskt till avstånd mellan sektionerna och omsluter varje sektion i ett visuellt block med rundade hörn.
Att använda Section är avgörande för formulärets läsbarhet: element som grupperas efter betydelse uppfattas lättare av användaren. På profilinställningsskärmen kan man till exempel dela upp i separata sektioner "Personuppgifter", "Aviseringar" och "Säkerhet". Varje sektion kan innehålla en sidfot med förklarande text som systemet visar med mindre typsnitt under elementgruppen.
Form {
Section(header: Text("Profil")) {
TextField("Namn", text: $name)
TextField("Email", text: $email)
}
Section(header: Text("Aviseringar"),
footer: Text("Inaktivera under möten")) {
Toggle("Push notifications", isOn: $pushEnabled)
Toggle("Email notifications", isOn: $emailEnabled)
}
}
I exemplet innehåller den första sektionen "Profile" två textfält utan sidfot, den andra sektionen "Notifications" två reglage med en förklaring under gruppen. Sidfoten lägger automatiskt till ett avstånd och använder caption-teckensnittsstilen. Section kan innehålla en sidfot utan rubrik eller en rubrik utan sidfot.
Form stödjer alla standardmässiga SwiftUI-inmatningselement. Picker i Form visas automatiskt som en navigeringsrad med övergång till en separat valskärm på iOS. Toggle visas som en rad med ett reglage som är justerat mot högerkanten. TextField får systemets inmatningsstil med en placeholder.
För numeriska värden används Stepper (stegvis ändring) och Slider (jämn ändring inom ett intervall). DatePicker stödjer flera lägen: date, time, dateAndTime. För färgval finns ColorPicker. Varje element anpassas till plattformen utan extra kod — på iOS använder kontrollerna UIKit:s inbyggda stilar, på macOS AppKit.
| Element | Ändamål | Stil i Form |
|---|---|---|
| TextField | Textinmatning | Rad med placeholder |
| SecureField | Lösenordsinmatning | Rad med dolda tecken |
| Picker | Val från lista | NavigationLink till valskärmen |
| Toggle | På/Av | Rad med reglage |
| Slider | Värdeintervall | Horisontell reglage |
| DatePicker | Välj datum/tid | Kompakt eller hjulstil |
För anpassade kontroller i Form kan valfria SwiftUI Views användas — de ärver sektionens standardbeteende. Men det rekommenderas att hålla sig till systemelementen, eftersom de garanterar överensstämmelse med HIG och stödjer Accessibility (VoiceOver, Dynamic Type) utan ytterligare konfigurering.
Vi tittar på att skapa en registreringsskärm med Form. Formuläret innehåller fyra sektioner: personuppgifter, rollval, prenumerationsinställningar och en skickaknapp. Section används för gruppering och standardkontroller i SwiftUI.
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("Personuppgifter")) {
TextField("Name", text: $name)
TextField("Email", text: $email)
.keyboardType(.emailAddress)
}
Section(header: Text("Roll")) {
Picker("Select role", selection: $role) {
ForEach(roles, id: \.self) { role in
Text(role).tag(role)
}
}
}
Section {
Toggle("Agree to terms", isOn: $agreedToTerms)
}
Section {
Button("Registrera") {
submitForm()
}
.disabled(!agreedToTerms)
}
}
.navigationTitle("Registration")
}
}
private func submitForm() { }
}
Formuläret är uppdelat i fyra Section: personuppgifter med två textfält, rollval via Picker, samtycke till villkoren via Toggle och registreringsknappen. Knappen är inaktiverad tills användaren samtycker till villkoren — detta är ett exempel på validering i Form. NavigationStack lägger till en rubrik och gör att Picker kan öppna en separat valskärm på iOS.
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("Utseende")) {
Toggle("Dark mode", isOn: $isDarkMode)
Slider(value: $volume, in: 0...1) {
Text("Volym")
}
}
Section(header: Text("Påminnelser"),
footer: Text("Du får en avisering vid vald tid")) {
DatePicker("Remind at",
selection: $reminderDate,
displayedComponents: .hourAndMinute)
}
Section {
NavigationLink("Advanced Settings",
destination: AdvancedSettingsView())
}
}
.navigationTitle("Settings")
}
}
}
Detta exempel visar kombinationen Slider, DatePicker och NavigationLink i Form. DatePicker använder läget hourAndMinute för att endast visa tiden. NavigationLink i den sista sektionen skapar en övergång till skärmen för avancerade inställningar — ett vanligt mönster för Settings-liknande gränssnitt. Sektionernas rubriker och sidfötter gör formuläret självdokumenterande: användaren förstår direkt vilken grupp varje kontroll tillhör.
Vanliga frågor
Form är optimerad för datainmatning och inställningar: kontrollerna får systemstilar, sektionerna rundade hörn och avstånd. List är en universell container för att visa data. Form passar för inställningsskärmar, List för chattar, flöden och kataloger.
Ja, Picker i Form visas automatiskt som en rad med det valda värdet och en NavigationLink för val från lista på iOS. På macOS visas Picker som en rullgardinslista eller radiogrupp beroende på stilen. Anpassningen sker utan extra kod.
Alla SwiftUI Views kan placeras i Form eller Section. För anpassade kontroller rekommenderas att ärva sektionens standardavstånd och stödja Dynamic Type via systemtypsnitt. Undvik fasta storlekar och färger så att formuläret visas korrekt på alla enheter.
Ja, Form omsluts automatiskt i en ScrollView om innehållet överskrider skärmhöjden. Det behövs ingen manuell ScrollView — systemet avgör själv om rullning behövs. För formulär som inte ska rullas, använd VStack med fast höjd.
Form på iOS stödjer två stilar via modifieraren .formStyle(.grouped) — standardvyn grouped med rundade sektioner. För macOS finns .formStyle(.columns) med flerkolumnslayout. Stilen tillämpas på hela Form på en gång och ändrar den visuella representationen av alla element inuti.
Slutsatser
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också