Form ve SwiftUI je kontejnerová komponenta pro vytváření strukturovaných rozhraní pro nastavení a zadávání dat, která následuje design Settings v iOS. Komponenta automaticky seskupuje ovládací prvky do sekcí se systémovými mezerami a styly, čímž zbavuje vývojáře ruční kalibrace oddělovačů a barev. Podle Apple Developer Documentation (2025) Form přizpůsobuje vzhled každé platformě — od grouped tabulek na iOS po standardní seznamy na macOS — při zachování jednotného API.
Nejdůležitější
Form je specializovaný kontejner SwiftUI určený k vytváření formulářů pro zadávání dat a obrazovek nastavení. Dědí chování List, ale přidává platformní styly: na iOS se Form zobrazuje jako grouped tabulka se zaoblenými rohy sekcí, na macOS jako standardní systémový seznam se zaškrtávacími políčky a ovládacími prvky.
Na rozdíl od ručního rozvržení s VStack a HStack Form automaticky rozmístí mezery mezi prvky, přidává oddělovače a přizpůsobuje vzhled systémovému motivu — světlému nebo tmavému. Vývojář popisuje pouze logickou strukturu: Section pro seskupování a ovládací prvky uvnitř. Formulář sám rozhoduje, jak vizuálně rozmístit Picker, Toggle nebo Stepper na konkrétní platformě.
Form podporuje všechny standardní prvky pro zadávání ve SwiftUI: TextField pro text, SecureField pro hesla, Picker pro výběr ze seznamu, Toggle pro zapnutí/vypnutí, Slider pro rozsahy, Stepper pro krokové hodnoty a DatePicker pro datum. Každý prvek automaticky získá styl odpovídající HIG (Human Interface Guidelines) od Apple na cílové platformě.
Přes vnější podobnost řeší Form a List různé úkoly. List je univerzální kontejner pro zobrazování rolovatelných seznamů dat s možností swipe akcí a úprav řádků. Form je specializovaný kontejner pro zadávání dat a nastavení, optimalizovaný pro systémové styly ovládacích prvků.
List se hodí pro zobrazování dynamických dat: zpravodajské kanály, chaty, katalogy produktů. Form — pro statické obrazovky s předvídatelnou sadou polí: uživatelský profil, nastavení aplikace, registrační formulář. Klíčový rozdíl: prvky Formu mohou být interaktivními ovládacími prvky, zatímco řádky Listu nejčastěji zobrazují data a na klepnutí reagují navigací nebo akcí.
| Parametr | Form | List |
|---|---|---|
| Účel | Zadávání dat, nastavení | Zobrazení seznamů |
| Styl sekcí | Grouped (iOS), systémový (macOS) | Plain nebo Grouped |
| Ovládací prvky | Picker, Toggle, Slider, Stepper | Omezené (tlačítko) |
| Dynamická data | Omezené (ForEach uvnitř Section) | Plná podpora |
| Swipe akce | Ano, swipeActions | Ano, swipeActions |
Podle Apple Human Interface Guidelines (2025) by se Form měl používat pro obrazovky nastavení a zadávání, kde se na jedné obrazovce nachází 3 až 20 ovládacích prvků a rozdělení do sekcí zlepšuje vnímání.
Section je hlavní stavební blok Formu, který umožňuje seskupovat logicky související prvky. Každá Section může mít nadpis, patičku a libovolný počet ovládacích prvků uvnitř. Systém automaticky přidává mezery mezi sekcemi a obaluje každou do vizuálního bloku se zaoblenými rohy.
Použití Section je klíčové pro čitelnost formuláře: prvky seskupené podle významu uživatel snáze vnímá. Například na obrazovce nastavení profilu lze rozdělit do samostatných sekcí „Osobní údaje", „Oznámení" a „Zabezpečení". Každá sekce může obsahovat patičku s vysvětlujícím textem, který systém zobrazí menším písmem pod skupinou prvků.
Form {
Section(header: Text("Profil")) {
TextField("Jméno", text: $name)
TextField("Email", text: $email)
}
Section(header: Text("Oznámení"),
footer: Text("Vypnout během schůzek")) {
Toggle("Push notifications", isOn: $pushEnabled)
Toggle("Email notifications", isOn: $emailEnabled)
}
}
V příkladu první sekce „Profile" obsahuje dvě textová pole bez patičky, druhá sekce „Notifications" dva přepínače s vysvětlením pod skupinou. Patička automaticky přidává mezeru a používá styl písma caption. Section může obsahovat patičku bez nadpisu nebo nadpis bez patičky.
Form podporuje všechny standardní prvky pro zadávání ve SwiftUI. Picker ve Formu se automaticky zobrazuje jako navigační řádek s přechodem na samostatnou obrazovku výběru na iOS. Toggle se zobrazuje jako řádek s přepínačem zarovnaným k pravému okraji. TextField získává systémový styl zadávání s placeholderem.
Pro číselné hodnoty se používají Stepper (kroková změna) a Slider (plynulá změna v rozsahu). DatePicker podporuje několik režimů: date, time, dateAndTime. Pro výběr barvy je k dispozici ColorPicker. Každý prvek se přizpůsobí platformě bez dalšího kódu — na iOS používají ovládací prvky nativní styly UIKit, na macOS AppKit.
| Prvek | Účel | Styl ve Form |
|---|---|---|
| TextField | Zadávání textu | Řádek s placeholderem |
| SecureField | Zadávání hesla | Řádek se skrytými znaky |
| Picker | Výběr ze seznamu | NavigationLink na obrazovku výběru |
| Toggle | Zapnout/Vypnout | Řádek s přepínačem |
| Slider | Rozsah hodnot | Vodorovný posuvník |
| DatePicker | Výběr data/času | Kompaktní nebo kolečkový styl |
Pro vlastní ovládací prvky uvnitř Form lze použít libovolné SwiftUI View — dědí standardní chování sekce. Nicméně se doporučuje držet se systémových prvků, protože zaručují soulad s HIG a podporují Accessibility (VoiceOver, Dynamic Type) bez dalšího nastavení.
Podívejme se na vytvoření registrační obrazovky pomocí Form. Formulář obsahuje čtyři sekce: osobní údaje, výběr role, nastavení předplatného a tlačítko odeslání. K seskupování se používají Section a standardní ovládací prvky 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("Osobní údaje")) {
TextField("Name", text: $name)
TextField("Email", text: $email)
.keyboardType(.emailAddress)
}
Section(header: Text("Role")) {
Picker("Select role", selection: $role) {
ForEach(roles, id: \.self) { role in
Text(role).tag(role)
}
}
}
Section {
Toggle("Agree to terms", isOn: $agreedToTerms)
}
Section {
Button("Registrovat se") {
submitForm()
}
.disabled(!agreedToTerms)
}
}
.navigationTitle("Registration")
}
}
private func submitForm() { }
}
Formulář je rozdělen do čtyř Section: osobní údaje se dvěma textovými poli, výběr role přes Picker, souhlas s podmínkami přes Toggle a tlačítko registrace. Tlačítko je neaktivní, dokud uživatel nesouhlasí s podmínkami — to je příklad validace uvnitř Formu. NavigationStack přidává nadpis a umožňuje Pickeru otevřít samostatnou obrazovku výběru na 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("Vzhled")) {
Toggle("Dark mode", isOn: $isDarkMode)
Slider(value: $volume, in: 0...1) {
Text("Hlasitost")
}
}
Section(header: Text("Připomenutí"),
footer: Text("Ve zvolený čas obdržíte oznámení")) {
DatePicker("Remind at",
selection: $reminderDate,
displayedComponents: .hourAndMinute)
}
Section {
NavigationLink("Advanced Settings",
destination: AdvancedSettingsView())
}
}
.navigationTitle("Settings")
}
}
}
Tento příklad ukazuje kombinaci Slider, DatePicker a NavigationLink uvnitř Formu. DatePicker používá režim hourAndMinute pro zobrazení pouze času. NavigationLink v poslední sekci vytváří přechod na obrazovku rozšířeného nastavení — běžný vzor pro rozhraní ve stylu Settings. Nadpisy a patičky sekcí činí formulář samodokumentujícím: uživatel okamžitě pochopí, do které skupiny každý ovládací prvek patří.
Časté dotazy
Form je optimalizován pro zadávání dat a nastavení: ovládací prvky získávají systémové styly, sekce zaoblené rohy a mezery. List je univerzální kontejner pro zobrazení dat. Form se hodí pro obrazovky nastavení, List pro chaty, kanály, katalogy.
Ano, Picker uvnitř Formu se automaticky zobrazuje jako řádek s vybranou hodnotou a NavigationLink pro výběr ze seznamu na iOS. Na macOS se Picker zobrazuje jako rozevírací seznam nebo skupina radio tlačítek podle stylu. Přizpůsobení probíhá bez dalšího kódu.
Jakýkoli SwiftUI View lze umístit uvnitř Form nebo Section. U vlastních ovládacích prvků se doporučuje dědit standardní mezery sekce a podporovat Dynamic Type pomocí systémových písem. Vyhněte se pevným velikostem a barvám, aby se formulář správně zobrazoval na všech zařízeních.
Ano, Form se automaticky obalí do ScrollView, pokud obsah přesáhne výšku obrazovky. Není třeba přidávat ScrollView ručně — systém sám určí potřebu rolování. Pro formuláře, které se nemají rolovat, použijte VStack s pevnou výškou.
Form na iOS podporuje dva styly pomocí modifikátoru .formStyle(.grouped) — standardní grouped vzhled se zaoblenými sekcemi. Pro macOS je k dispozici .formStyle(.columns) s více sloupcovým uspořádáním. Styl se aplikuje na celý Form najednou a mění vizuální zobrazení všech prvků uvnitř.
Závěry
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také