List SwiftUI میں ڈیٹا کو عمودی طور پر اسکرول کرنے کے قابل فہرست کے طور پر ظاہر کرنے کے لیے ایک کنٹینر View ہے، جو UIKit میں UITableView کے مشابہ ہے۔ Apple Developer Documentation, 2024 کے مطابق، List جامد اور متحرک حصوں، سوائپ ایکشنز، قطاروں کی دوبارہ ترتیب اور پل ٹو رিফریش کو سپورٹ کرتا ہے۔ UITableView کے برعکس، List SwiftUI اور ForEach پر مبنی ایک اعلانیہ API استعمال کرتا ہے، خودکار طور پر سیل کے دوبارہ استعمال اور بڑی تعداد میں قطاروں کے ساتھ کارکردگی کا انتظام کرتا ہے۔
اہم نکات
List ایک View ہے جو آئٹمز کی ترتیب کو عمودی طور پر اسکرول کرنے کے قابل فہرست میں ظاہر کرتا ہے۔ یہ iOS 13 میں SwiftUI کے ساتھ متعارف کرایا گیا تھا اور ڈیٹا فہرستوں کو ظاہر کرنے کا بنیادی طریقہ ہے، جو UIKit کے UITableView کی جگہ لیتا ہے۔ List خودکار طور پر سیل کے دوبارہ استعمال، اسکرولنگ اور کارکردگی کا انتظام کرتا ہے۔
List سست لوڈنگ کا استعمال کرتا ہے: سیل اسکرول کرنے پر بنائے جاتے ہیں، ایک ساتھ نہیں۔ یہ اسے ScrollView کے اندر VStack اور ForEach سے الگ کرتا ہے، جہاں تمام سیل رینڈر کے وقت بنائے جاتے ہیں۔ List سوائپ ایکشنز، پل ٹو رفریش، ایڈیٹنگ (حذف/منتقل) اور قطار کے انتخاب کے لیے بلٹ ان سپورٹ بھی فراہم کرتا ہے۔
Apple WWDC 2021 (Session 10072) کے مطابق، iOS 15+ میں List کو کلیکشن کی سطح پر ایک نئے تفریق میکانزم کی وجہ سے نمایاں کارکردگی میں بہتری ملی۔ اس نے ڈیٹا اپ ڈیٹ کرتے وقت List کو زیادہ موثر بنا دیا، خاص طور پر سینکڑوں قطاروں والی فہرستوں کے لیے۔
ڈویلپرز اکثر Views کے سیٹ کو ظاہر کرنے کے لیے List اور ScrollView کے ساتھ VStack کے درمیان انتخاب کرتے ہیں۔ بنیادی فرق: List سیل دوبارہ استعمال (UITableView کی طرح) کرتا ہے، جبکہ ScrollView + VStack فوری طور پر تمام Views بناتا ہے۔ مقررہ سائز کی فہرستوں (20 آئٹمز تک) کے لیے، فرق نہ ہونے کے برابر ہے۔ 50+ قطاروں والی متحرک فہرستوں کے لیے، کارکردگی کے لحاظ سے List افضل ہے۔
جامد فہرست ایک مقررہ تعداد میں قطاروں والی فہرست ہے جو براہ راست List باڈی میں بتائی گئی ہیں۔ یہ مینوز، ترتیبات اور معلوم آئٹم سیٹ والے فارمز کے لیے استعمال ہوتی ہے۔ ہر قطار لوپ یا ForEach کے بغیر واضح طور پر اعلان کی جاتی ہے۔
// جامد فہرست (مینوز اور ترتیبات کے لیے)
List {
Text("پروفائل")
Text("ترتیبات")
Text("کے بارے میں")
}
// متحرک فہرست (ڈیٹا کے لیے)
struct UserList: View {
let users: [User]
var body: some View {
List(users) { user in
HStack {
Text(user.name)
Text(user.role)
.foregroundColor(.secondary)
}
}
}
}
متحرک فہرست List(data:rowContent:) انیشیالائزر یا List باڈی کے اندر ForEach استعمال کرتی ہے۔ پہلا طریقہ کارآمد ہے جب ہر قطار ڈیٹا کے ایک آئٹم سے مطابقت رکھتی ہو۔ دوسرا اس وقت مفید ہے جب ڈیٹا کے درمیان حصے یا اضافی آئٹمز ہوں۔
شناخت (Identifiable): متحرک فہرستوں کے لیے، ڈیٹا آئٹمز کو Identifiable پروٹوکول کی پابندی کرنی چاہیے، یا data:id ٹیوپل میں ایک منفرد شناخت کنندہ کے لیے KeyPath بتانا ہوگا۔ SwiftUI تبدیلیوں کو ٹریک کرنے کے لیے شناخت کنندگان کا استعمال کرتا ہے: اضافہ، حذف اور قطاروں کی منتقلی۔
Section ایک View ہے جو List میں قطاروں کو عنوان اور اختیاری footer کے ساتھ گروپ کرتی ہے۔ Section header اور footer کو ViewBuilder کے طور پر قبول کرتا ہے، جس سے سیکشن عنوانات کے لیے نہ صرف متن بلکہ حسب ضرورت Views استعمال کرنا ممکن ہوتا ہے۔
struct SettingsView: View {
var body: some View {
List {
Section(header: Text("اکاؤنٹ")) {
Text("نام")
Text("ای میل")
}
Section(header: Text("اطلاعات")) {
Toggle("Push", isOn: $pushEnabled)
Toggle("Email", isOn: $emailEnabled)
}
}
.listStyle(.insetGrouped)
}
}
// ForEach کے ساتھ متحرک حصے
List {
ForEach(groupedData.keys.sorted(), id: \.self) { key in
Section(header: Text(key)) {
ForEach(groupedData[key]!) { item in
Text(item.title)
}
}
}
}
List اسٹائل: SwiftUI .listStyle() موڈیفائر کے ذریعے کئی بلٹ ان اسٹائل فراہم کرتا ہے۔ .insetGrouped — iOS Settings کے لیے معیاری، .plain — کم سے کم، .inset — انڈینٹیشن کے ساتھ، .sidebar — iPad پر Sidebar کے لیے۔
SwiftUI Cookbook (2024) کے مطابق، متحرک حصوں اور اندر ForEach کے ساتھ Section پیچیدہ ڈھانچے والی ایپلیکیشنز میں ڈیٹا گروپنگ کے لیے ایک معیاری پیٹرن ہے۔ کلیدی اصول: Section کو Section کے اندر مت ڈالیں، اور Section کے ساتھ List(data:) انیشیالائزر استعمال نہ کریں — List باڈی کے اندر ForEach استعمال کریں۔
.swipeActions(edge:allowsFullSwipe:content:) — iOS 15+ کے لیے ایک موڈیفائر جو List قطاروں میں سوائپ ایکشنز شامل کرتا ہے۔ بائیں (ڈیفالٹ) یا دائیں سوائپ کرتے وقت مختلف رنگوں اور کرداروں (destructive, cancel) کے ساتھ بٹن دکھانے کی اجازت دیتا ہے۔
struct TaskList: View {
@Binding var tasks: [Task]
var body: some View {
List {
ForEach($tasks) { $task in
Text(task.title)
.swipeActions(edge: .trailing) {
Button("حذف کریں", role: .destructive) {
tasks.removeAll { $0.id == task.id }
}
}
.swipeActions(edge: .leading) {
Button(task.isDone ? "واپس کریں" : "ہو گیا") {
task.isDone.toggle()
}
.tint(.green)
}
}
}
.refreshable {
// غیر متزامن ڈیٹا لوڈنگ
await loadTasks()
}
}
}
.refreshable — iOS 15+ کے لیے ایک موڈیفائر جو پل ٹو رفریش شامل کرتا ہے۔ یہ ایک async closure قبول کرتا ہے جو اس وقت عمل میں آتا ہے جب صارف فہرست کو نیچے کھینچتا ہے۔ SwiftUI خود بخود ایک لوڈنگ انڈیکیٹر دکھاتا ہے۔ آپریشن مکمل ہونے کے بعد، انڈیکیٹر چھپ جاتا ہے۔
.onDelete اور .onMove — iOS 13+ کے لیے موڈیفائرز جو قطاروں کو حذف کرنے اور دوبارہ ترتیب دینے کے لیے سپورٹ شامل کرتے ہیں۔ انہیں استعمال کرنے کے لیے، ڈیٹا کو Binding کے ساتھ ForEach میں لپیٹیں یا List یا ForEach پر .onDelete(perform:) کے ذریعے closures پاس کریں۔
List کی کارکردگی قطاروں کی تعداد، ہر سیل کی پیچیدگی اور ڈیٹا اپ ڈیٹ کی تعدد پر منحصر ہے۔ SwiftUI سست لوڈنگ اور سیل دوبارہ استعمال (UITableView.dequeueReusableCell کی طرح) استعمال کرتا ہے، لیکن 500+ قطاروں والی فہرستوں کے لیے اضافی اصلاح کی ضرورت ہو سکتی ہے۔
| اصلاح | وضاحت | iOS ورژن |
|---|---|---|
| Identifiable | ہر آئٹم کے لیے منفرد IDs | iOS 13+ |
| EquatableView | ڈیٹا برابر ہونے پر دوبارہ ڈرائنگ سے بچتا ہے | iOS 13+ |
| id(_:) | ID تبدیل ہونے پر View کی دوبارہ تخلیق پر مجبور کرتا ہے | iOS 13+ |
| .equatable() | Equatable کے ذریعے سخت موازنہ | iOS 15+ |
| Diffable data | تبدیلیوں پر خودکار تفریق | iOS 15+ |
مسئلہ 1: بار بار اپ ڈیٹ. اگر فہرست میں ڈیٹا بار بار اپ ڈیٹ ہوتا ہے (مثال کے طور پر، ہر سیکنڈ)، List ہر حالت کی تبدیلی پر نظر آنے والے سیل کو دوبارہ کھینچ سکتا ہے۔ حل: ڈیٹا کے لیے سٹرکچرز (ویلیو ٹائپس) استعمال کریں — SwiftUI ان کا قدر سے موازنہ کرتا ہے اور صرف تبدیل شدہ قطاروں کو دوبارہ کھینچتا ہے۔
مسئلہ 2: بھاری سیل. اگر ہر قطار میں پیچیدہ View درجہ بندی، تصاویر اور اینیمیشنز ہوں، تو اسکرولنگ سست ہو سکتی ہے۔ حل: سیل کو الگ Views میں نکالیں، غیر ضروری دوبارہ ڈرائنگ سے بچنے کے لیے EquatableView استعمال کریں۔ SwiftUI Lab (2024) کے مطابق، ایک پیچیدہ قطار کو ذیلی اجزاء میں تقسیم کرنے سے رینڈرنگ کا وقت 30–50% کم ہو جاتا ہے۔
مسئلہ 3: بڑی تعداد میں قطاریں۔ 1000+ قطاروں کے ساتھ، List سست لوڈنگ کی وجہ سے اب بھی مؤثر طریقے سے کام کرتا ہے، لیکن لے آؤٹ حساب کی وجہ سے ابتدائی لوڈنگ سست ہو سکتی ہے۔ حل: صرف یکساں قطاروں والی فہرستوں کے لیے LazyVStack استعمال کریں جہاں List کی خصوصیات (سوائپ، حصے) کی ضرورت نہ ہو۔ مکمل خصوصیات والی فہرستوں کے لیے، List بہترین انتخاب ہے۔
اکثر پوچھے گئے سوالات
List SwiftUI میں اسکرول کرنے کے قابل ڈیٹا فہرست ظاہر کرنے کے لیے ایک کنٹینر View ہے۔ یہ اعلانیہ API کے ساتھ UIKit میں UITableView کے مساوی ہے۔ حصوں، سوائپ ایکشنز، پل ٹو رفریش، ایڈیٹنگ اور .listStyle() کے ذریعے تخصیص کو سپورٹ کرتا ہے۔
List سست لوڈنگ اور سیل دوبارہ استعمال استعمال کرتا ہے — سیل اسکرول کرنے پر بنائے جاتے ہیں۔ ScrollView + VStack ایک ساتھ تمام Views بناتا ہے۔ 50+ قطاروں والی فہرستوں کے لیے، List افضل ہے۔ مقررہ چھوٹے سیٹ (20 آئٹمز تک) کے لیے، فرق نہ ہونے کے برابر ہے۔
.refreshable موڈیفائر (iOS 15+) استعمال کریں۔ ڈیٹا اپ ڈیٹ منطق کے ساتھ ایک async closure پاس کریں۔ SwiftUI خود بخود ایک لوڈنگ انڈیکیٹر دکھاتا ہے اور async آپریشن مکمل ہونے کے بعد اسے چھپا دیتا ہے۔
عنوان اور اختیاری footer کے ساتھ Section View استعمال کریں۔ فہرست کی قطاروں کو Section کے اندر رکھیں۔ متحرک حصوں کے لیے، groupedData کے ساتھ ForEach استعمال کریں۔ iOS جیسی ظاہری شکل کے لیے .listStyle(.insetGrouped) کے ذریعے فہرست کا اسٹائل ترتیب دیا جاتا ہے۔
ڈیٹا کے لیے سٹرکچرز (ویلیو ٹائپس) استعمال کریں، پیچیدہ سیل کو EquatableView کے ساتھ الگ Views میں نکالیں، ہر قطار میں بار بار اسٹیٹ اپ ڈیٹ سے بچیں۔ 1000+ قطاروں والی فہرستوں کے لیے، اگر List کی خصوصیات کی ضرورت نہ ہو تو LazyVStack پر غور کریں۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں