Section di SwiftUI adalah komponen kontainer untuk pengelompokan logis elemen di dalam Form atau List. Komponen ini menampilkan konten sebagai blok visual dengan jarak sistem, sudut membulat, dan header serta footer opsional. Menurut Apple Developer Documentation (2025), Section tidak mengelola data, hanya mengatur presentasi: semua elemen anak mewarisi gaya dan jaraknya, memastikan tampilan terstruktur dari formulir dan daftar.
Poin utama
Section adalah komponen struktural SwiftUI yang dirancang untuk mengelompokkan elemen di dalam kontainer Form dan List. Tidak seperti VStack atau HStack, Section menambahkan jarak sistem, header dan footer, serta penyorotan visual grup dalam bentuk blok dengan sudut membulat di iOS.
Section tidak mengubah perilaku elemen anak — hanya mengatur presentasinya. Semua kontrol di dalam Section — Picker, Toggle, TextField — berfungsi normal, tetapi secara visual disatukan dalam grup logis. Ini sangat penting untuk layar formulir di mana pengguna harus dengan cepat menavigasi struktur data yang dimasukkan.
Sistem secara otomatis mengelola jarak antar bagian: jarak antara Section di iOS adalah 16–20 poin, antara elemen di dalam Section — 0 (pemisah antar baris). Pengembang tidak dapat mengubah jarak ini melalui pengubah padding — jarak tersebut dikontrol oleh sistem untuk memastikan tampilan yang seragam.
Section menerima dua parameter opsional: header — judul grup, dan footer — teks penjelasan di bawah grup. Header ditampilkan di atas elemen bagian dengan font tebal gaya caption, footer — dengan font lebih kecil berwarna abu-abu. Kedua parameter menerima SwiftUI View apa pun, bukan hanya Text.
Header Section membantu pengguna memahami kategori mana elemen dalam grup tersebut. Misalnya, pada layar pengaturan, header „Notifikasi“, „Privasi“, dan „Akun“ langsung mengarahkan pengguna. Footer cocok untuk penjelasan: „Nonaktifkan notifikasi selama rapat“ atau „Kata sandi harus mengandung setidaknya 8 karakter“. Footer secara otomatis terbagi menjadi beberapa baris jika diperlukan.
Section(
header: Text("Keamanan Akun"),
footer: Text("Gunakan kata sandi yang kuat dengan setidaknya 8 karakter.")
) {
SecureField("Current password", text: $currentPassword)
SecureField("New password", text: $newPassword)
}
Dalam contoh, Section memiliki header „Keamanan Akun“ dan footer dengan saran keamanan kata sandi. Pengguna melihat header sebagai label bagian, mengisi dua bidang, dan segera membaca peringatan di bawahnya. Struktur seperti itu meningkatkan UX karena semua informasi tentang bagian berada pada satu layar tanpa perlu mengakses bantuan terpisah.
Section berfungsi baik di dalam Form maupun List, tetapi tampilan visualnya berbeda. Di Form, Section ditampilkan sebagai blok dengan sudut membulat dan latar belakang sistem, dipisahkan dari bagian tetangga oleh jarak. Di List, Section dapat menggunakan gaya plain — tanpa latar belakang dan pembulatan, atau inset-grouped — dengan blok membulat, mirip dengan Form.
Pilihan kontainer memengaruhi gaya Section. Menempatkan Section dengan konten yang sama di dalam Form dan List dengan gaya .insetGrouped akan memberikan hasil yang identik. Namun, Form menambahkan jarak sistem dan secara default menggunakan gaya grouped, sementara List memerlukan penentuan gaya secara eksplisit melalui pengubah .listStyle(.insetGrouped).
| Kontainer | Section default | Gaya yang tersedia |
|---|---|---|
| Form | InsetGrouped dengan sudut membulat | .grouped (hanya Form) |
| List | Plain — tanpa latar bagian | .plain, .inset, .insetGrouped, .sidebar |
Untuk mendapatkan tampilan yang sama di List, gunakan .listStyle(.insetGrouped). Gaya ini meniru tampilan Form dan cocok untuk layar pengaturan yang dibangun di atas List. Untuk daftar data standar, gunakan .plain — tanpa penyorotan bagian, dengan pemisah tipis antar baris.
Section dapat berisi jumlah elemen yang dinamis melalui ForEach. Ini memungkinkan pembuatan grup dengan elemen berulang, sambil mempertahankan header dan footer untuk seluruh grup. ForEach di dalam Section mengulangi koleksi data dan membuat View anak untuk setiap elemen tanpa mengganggu struktur bagian.
Bagian dinamis berguna untuk layar pengaturan dengan jumlah opsi yang bervariasi: daftar bahasa yang tersedia untuk dipilih, daftar perangkat yang terhubung, atau daftar langganan push. Header bagian tetap statis, sementara konten berubah tergantung pada data.
struct DynamicSectionView: View {
let categories = ["Work", "Personal", "Finance", "Health"]
@State private var selected = Set<String>()
var body: some View {
Form {
Section(header: Text("Kategori"),
footer: Text("Pilih kategori yang Anda sukai")) {
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("Dipilih: \(selected.count) kategori")
.foregroundStyle(.secondary)
}
}
}
}
Dalam contoh ini, ForEach menghasilkan Toggle untuk setiap kategori dari array categories. Header dan footer bagian diatur sekali dan berlaku untuk seluruh grup. Bagian kedua menampilkan jumlah kategori yang dipilih — tidak bergantung pada ForEach dan tetap statis. Pendekatan ini memungkinkan pembuatan formulir fleksibel di mana header dan footer mengontekstualisasikan grup elemen dinamis.
Mari kita lihat contoh lengkap layar profil menggunakan Section untuk mengelompokkan data. Formulir berisi tiga bagian: informasi pengguna, pengaturan privasi, dan statistik. Setiap bagian menggunakan headernya sendiri, dan yang terakhir — footer dengan informasi ringkasan.
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("Info Profil")) {
TextField("Display name", text: $displayName)
TextField("Bio", text: $bio, axis: .vertical)
.lineLimit(3)
}
Section(header: Text("Privasi")) {
Toggle("Public profile", isOn: $isProfilePublic)
Toggle("Show email", isOn: $showEmail)
.disabled(!isProfilePublic)
}
Section(header: Text("Statistik"),
footer: Text("Terakhir diperbarui hari ini pukul 14:30")) {
LabeledContent("Posts", value: "42")
LabeledContent("Followers", value: "1,280")
LabeledContent("Following", value: "346")
}
}
.navigationTitle("Profile")
}
}
Tiga Section dengan jelas memisahkan blok fungsional: bidang profil yang dapat diedit, sakelar privasi, dan statistik. Bagian kedua mendemonstrasikan validasi: Toggle „Tampilkan email“ dinonaktifkan sampai profil menjadi publik. Footer bagian ketiga menunjukkan waktu pembaruan terakhir — contoh penggunaan footer untuk informasi kontekstual tambahan. LabeledContent adalah komponen SwiftUI standar untuk menampilkan pasangan „kunci-nilai“ di Form.
Section(
header: HStack {
Image(systemName: "bell.fill")
.foregroundStyle(.blue)
Text("Notifikasi")
.font(.headline)
},
footer: Text("Kelola notifikasi push dan email")
) {
Toggle("Push notifications", isOn: $push)
Toggle("Email notifications", isOn: $email)
Stepper("Quiet hours: \(quietStart) — \(quietEnd)",
value: $quietStart,
in: 0...23)
}
Contoh ini menunjukkan bahwa header dapat berupa SwiftUI View apa pun. Penggunaan HStack dengan Image dan Text memungkinkan penambahan ikon di samping header, membuat bagian secara visual lebih ekspresif. Header khusus berguna untuk menyorot bagian penting dalam antarmuka: pengaturan notifikasi, fitur berbayar, atau bagian dengan peringatan. Namun, jangan berlebihan dengan header khusus — 1–2 bagian dengan tampilan tidak standar per layar sudah cukup untuk menjaga keseragaman antarmuka.
Pertanyaan yang sering diajukan
Tidak, Section tidak mendukung bersarang di SwiftUI. Mencoba menempatkan Section di dalam Section lain menyebabkan kesalahan kompilasi. Untuk pengelompokan hierarkis, gunakan List dengan OutlineGroup atau DisclosureGroup di dalam Section.
Jarak antar Section dikelola oleh sistem dan tidak dapat diubah melalui pengubah padding. Di iOS, jarak antar bagian adalah 16–20 poin dan sesuai dengan HIG. Satu-satunya cara untuk memengaruhi jarak adalah menggunakan ListStyle khusus, tetapi ini tidak disarankan.
Group adalah kontainer tak terlihat untuk mengelompokkan elemen tanpa format visual. Section menambahkan header, footer, jarak dan blok visual. Group digunakan untuk rendering bersyarat, Section — untuk penataan antarmuka.
Ya, Section secara otomatis menambahkan label aksesibilitas. Header bagian menjadi label aksesibilitas grup, footer menjadi petunjuk aksesibilitas. VoiceOver membaca header sebelum memasuki bagian, yang meningkatkan navigasi bagi pengguna dengan keterbatasan.
Tidak, Section hanya berfungsi di dalam Form atau List. Menggunakan Section di luar kontainer ini menyebabkan kesalahan kompilasi. Untuk mengelompokkan elemen di VStack atau ScrollView, gunakan Group atau View khusus dengan pengaturan jarak manual.
Ringkasan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga