List, SwiftUI'de verileri dikey olarak kaydırılabilir bir liste halinde görüntülemek için bir kapsayıcı View'dir, UIKit'teki UITableView'e benzer. Apple Developer Documentation, 2024'e göre, List statik ve dinamik bölümleri, kaydırma eylemlerini, satır yeniden sıralamayı ve çekerek yenilemeyi destekler. UITableView'in aksine, List SwiftUI ve ForEach'e dayalı bildirimsel bir API kullanır, hücre yeniden kullanımını ve çok sayıda satırla performansı otomatik olarak yönetir.
Önemli Noktalar
List, öğelerin bir dizisini dikey olarak kaydırılabilir bir listede görüntüleyen bir View'dir. iOS 13'te SwiftUI ile birlikte tanıtıldı ve UIKit'teki UITableView'in yerini alan veri listelerini görüntülemenin birincil yoludur. List, hücre yeniden kullanımını, kaydırmayı ve performansı otomatik olarak yönetir.
List, yavaş yüklemeyi kullanır: hücreler kaydırdıkça oluşturulur, hepsi bir kerede değil. Bu, onu ScrollView içindeki VStack ve ForEach'ten ayırır; burada tüm hücreler oluşturma zamanında oluşturulur. List ayrıca kaydırma eylemleri, çekerek yenileme, düzenleme (silme/taşıma) ve satır seçimi için yerleşik destek sağlar.
Apple WWDC 2021 (Session 10072)'ye göre, iOS 15+'daki List, koleksiyon düzeyinde yeni bir farklılaştırma mekanizması sayesinde önemli performans iyileştirmeleri aldı. Bu, özellikle yüzlerce satır içeren listeler için veri güncelleme sırasında List'i daha verimli hale getirdi.
Geliştiriciler genellikle bir View kümesini görüntülemek için List ile ScrollView + VStack arasında seçim yapar. Temel fark: List, hücre yeniden kullanımını (UITableView gibi) kullanırken, ScrollView + VStack tüm View'ları hemen oluşturur. Sabit boyutlu listeler (20 öğeye kadar) için fark ihmal edilebilir düzeydedir. 50+ satırlı dinamik listeler için performans açısından List tercih edilir.
Statik liste, doğrudan List gövdesinde belirtilen sabit sayıda satıra sahip bir listedir. Menüler, ayarlar ve bilinen öğe kümelerine sahip formlar için kullanılır. Her satır, döngü veya ForEach olmadan açıkça bildirilir.
// Statik liste (menüler ve ayarlar için)
List {
Text("Profil")
Text("Ayarlar")
Text("Hakkında")
}
// Dinamik liste (veriler için)
struct UserList: View {
let users: [User]
var body: some View {
List(users) { user in
HStack {
Text(user.name)
Text(user.role)
.foregroundColor(.secondary)
}
}
}
}
Dinamik liste, List(data:rowContent:) başlatıcısını veya List gövdesi içinde ForEach'i kullanır. İlk yaklaşım, her satırın bir veri öğesine karşılık gelmesi durumunda uygundur. İkincisi, veriler arasında bölümler veya ek öğeler olduğunda kullanışlıdır.
Tanımlama (Identifiable): Dinamik listeler için, veri öğeleri Identifiable protokolüne uymalı veya data:id demetinde benzersiz bir tanımlayıcıya KeyPath belirtmelisiniz. SwiftUI, değişiklikleri (ekleme, silme ve satır taşıma) izlemek için tanımlayıcıları kullanır.
Section, List'te satırları bir başlık ve isteğe bağlı footer ile gruplamak için bir View'dir. Section, header ve footer'ı ViewBuilder olarak kabul eder, bölüm başlıkları için yalnızca metin değil aynı zamanda özel View'lar kullanılmasına da olanak tanır.
struct SettingsView: View {
var body: some View {
List {
Section(header: Text("Hesap")) {
Text("Ad")
Text("E-posta")
}
Section(header: Text("Bildirimler")) {
Toggle("Push", isOn: $pushEnabled)
Toggle("Email", isOn: $emailEnabled)
}
}
.listStyle(.insetGrouped)
}
}
// ForEach ile dinamik bölümler
List {
ForEach(groupedData.keys.sorted(), id: \.self) { key in
Section(header: Text(key)) {
ForEach(groupedData[key]!) { item in
Text(item.title)
}
}
}
}
List Stilleri: SwiftUI, .listStyle() değiştiricisi aracılığıyla birkaç yerleşik stil sağlar. .insetGrouped — iOS Settings için standart, .plain — minimalist, .inset — girintili, .sidebar — iPad'de Sidebar için.
SwiftUI Cookbook (2024)'e göre, dinamik bölümler ve içinde ForEach bulunan Section, karmaşık yapıya sahip uygulamalarda verileri gruplamak için standart bir desendir. Temel kural: Section'ı Section içine yerleştirmeyin ve Section ile birlikte List(data:) başlatıcısını kullanmayın — List gövdesi içinde ForEach kullanın.
.swipeActions(edge:allowsFullSwipe:content:) — iOS 15+ için List satırlarına kaydırma eylemleri ekleyen bir değiştirici. Sola (varsayılan) veya sağa kaydırırken farklı renkler ve rollerle (destructive, cancel) düğmelerin görüntülenmesine olanak tanır.
struct TaskList: View {
@Binding var tasks: [Task]
var body: some View {
List {
ForEach($tasks) { $task in
Text(task.title)
.swipeActions(edge: .trailing) {
Button("Sil", role: .destructive) {
tasks.removeAll { $0.id == task.id }
}
}
.swipeActions(edge: .leading) {
Button(task.isDone ? "Geri al" : "Bitti") {
task.isDone.toggle()
}
.tint(.green)
}
}
}
.refreshable {
// Zamansız veri yükleme
await loadTasks()
}
}
}
.refreshable — iOS 15+ için çekerek yenileme ekleyen bir değiştirici. Kullanıcı listeyi aşağı çektiğinde yürütülen bir async closure kabul eder. SwiftUI otomatik olarak bir yükleme göstergesi görüntüler. İşlem tamamlandıktan sonra gösterge gizlenir.
.onDelete ve .onMove — iOS 13+ için satır silme ve yeniden sıralama desteği ekleyen değiştiriciler. Bunları kullanmak için, verileri Binding ile ForEach içine sarın veya List veya ForEach'te .onDelete(perform:) aracılığıyla closure'ları iletin.
List performansı satır sayısına, her hücrenin karmaşıklığına ve veri güncelleme sıklığına bağlıdır. SwiftUI, yavaş yükleme ve hücre yeniden kullanımı (UITableView.dequeueReusableCell'e benzer) kullanır, ancak 500+ satırlı listeler için ek optimizasyonlar gerekebilir.
| Optimizasyon | Açıklama | iOS sürümü |
|---|---|---|
| Identifiable | Her öğe için benzersiz kimlikler | iOS 13+ |
| EquatableView | Veriler eşit olduğunda yeniden çizmeyi önler | iOS 13+ |
| id(_:) | Kimlik değiştiğinde View'in yeniden oluşturulmasını zorlar | iOS 13+ |
| .equatable() | Equatable ile katı karşılaştırma | iOS 15+ |
| Diffable data | Değişikliklerde otomatik farklılaştırma | iOS 15+ |
Sorun 1: Sık güncellemeler. Listedeki veriler sık sık güncelleniyorsa (örneğin, her saniye), List her durum değişikliğinde görünür hücreleri yeniden çizebilir. Çözüm: veriler için yapılar (değer türleri) kullanın — SwiftUI bunları değere göre karşılaştırır ve yalnızca değişen satırları yeniden çizer.
Sorun 2: Ağır hücreler. Her satır karmaşık bir View hiyerarşisi, resimler ve animasyonlar içeriyorsa, kaydırma yavaşlayabilir. Çözüm: hücreleri ayrı View'lara çıkarın, gereksiz yeniden çizmeleri önlemek için EquatableView kullanın. SwiftUI Lab (2024)'e göre, karmaşık bir satırı alt bileşenlere ayırmak, oluşturma süresini %30–50 oranında azaltır.
Sorun 3: Çok sayıda satır. 1000+ satırla List, yavaş yükleme sayesinde hâlâ verimli çalışır, ancak düzen hesaplaması nedeniyle ilk yükleme yavaşlayabilir. Çözüm: List özelliklerinin (kaydırma, bölümler) gerekli olmadığı tek tip satırlara sahip listeler için yalnızca LazyVStack kullanın. Tam özellikli listeler için List en iyi seçim olmaya devam ediyor.
Sıkça Sorulan Sorular
List, SwiftUI'de kaydırılabilir bir veri listesi görüntülemek için bir kapsayıcı View'dir. Bildirimsel bir API ile UIKit'teki UITableView'in eşdeğeridir. Bölümleri, kaydırma eylemlerini, çekerek yenilemeyi, düzenlemeyi ve .listStyle() aracılığıyla özelleştirmeyi destekler.
List yavaş yükleme ve hücre yeniden kullanımı kullanır — hücreler kaydırdıkça oluşturulur. ScrollView + VStack tüm View'ları bir kerede oluşturur. 50+ satırlı listeler için List tercih edilir. Sabit küçük kümeler (20 öğeye kadar) için fark ihmal edilebilir düzeydedir.
.refreshable değiştiricisini (iOS 15+) kullanın. Veri güncelleme mantığına sahip bir async closure iletin. SwiftUI otomatik olarak bir yükleme göstergesi görüntüler ve async işlem tamamlandıktan sonra onu gizler.
Bir başlık ve isteğe bağlı footer ile Section View kullanın. Liste satırlarını Section içine yerleştirin. Dinamik bölümler için groupedData ile ForEach kullanın. iOS benzeri bir görünüm için liste stili .listStyle(.insetGrouped) ile yapılandırılır.
Veriler için yapılar (değer türleri) kullanın, karmaşık hücreleri EquatableView ile ayrı View'lara çıkarın, her satırda sık durum güncellemelerinden kaçının. 1000+ satırlı listeler için List özellikleri gerekli değilse LazyVStack'i değerlendirin.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun