- Published on
ForEach
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
List massiv va closure oladi β bu aslida ichida ForEach ishlatib ishlaydi. Lekin ba'zida ForEach-ni to'g'ridan-to'g'ri ko'rsatish kerak bo'ladi β masalan, statik qatorlar orasiga dinamik qatorlar qo'shish, yoki ScrollView ichida to'liq layout nazoratini saqlab aylanish imkonini berish uchun.
ForEach β view builder bo'lib, massivdagi har bir element uchun view yaratadi. U konteyner emas: scroll qilmaydi, qator uslubini bermaydi. Uni List, VStack, ScrollView yoki boshqa konteyner ichiga joylashtirasiz.
Asosiy qoida: ForEach faqat view-lar generatsiya qiladi, qolgan hamma narsani ota-ona konteyner bajaradi.
ForEach variantlari
ForEach(.indices) β indeks bilan kirish
ForEach(kitoblar.indices, id: \.self) { i in
HStack {
Text("\(i + 1).")
.foregroundStyle(.secondary)
Text(kitoblar[i].nomi)
}
}
Elementning tartib raqamiga yoki indeksiga kirish kerak bo'lganda .indices ishlating. id: \.self indeksning o'zi noyob bo'lgani uchun kerak.
.onMove β qayta tartiblash
List {
ForEach(vazifalar) { vazifa in
Text(vazifa.nomi)
}
.onMove { from, to in
vazifalar.move(fromOffsets: from, toOffset: to)
}
}
.toolbar { EditButton() }
Edit mode yoqilganda qatorlar yonida uch chiziqli siljitish tutqichi paydo bo'ladi. EditButton() yoki .environment(\.editMode, .constant(.active)) edit mode-ni yoqadi.
ScrollView ichida ForEach
ScrollView {
VStack(spacing: 12) {
ForEach(kartalar) { karta in
KartaView(karta: karta)
.padding(.horizontal)
}
}
}
Qator separatorlari va inset marginsiz to'liq layout nazorati kerak bo'lganda ScrollView + VStack + ForEach kombinatsiyasini ishlating. Kartalar, feed-lar va maxsus layoutlar uchun ideal.
ForEach an'anaviy tsikl emas: U Swift-dagi
fortsikl kabi ish vaqtida bajarilmaydi. Bu β ko'rsatish uchun view-lar guruhini tasvirlovchi SwiftUI view. Bu farq ishlash unumdorligi va joylashuv haqida o'ylayotganingizda muhim ahamiyat kasb etadi.
Qo'shimcha variantlar
ForEach inside VStack
ForEachniVStackichida ishlating β tizim ro'yxat stilisiz vertikal joylashuv uchun. Kartalar, yorliq bulutlari yoki maxsus joylashuvlar uchun qulay.
var body: some View {
VStack(alignment: .leading) {
// Views are stacked vertically, no scrolling, no separators
ForEach(fruits, id: \.self) { fruit in
Text(fruit)
.padding(.vertical, 4)
}
}
}
ForEach inside List with extra static rows
ListichidaForEachni aniq ishlatishning asosiy sababi: dinamik kontent bilan statik qatorlar, sarlavhalar, pastki qatorlarni aralashtirib ishlatish mumkin.
List {
// A static row above the dynamic content
Text("Today's picks")
.font(.headline)
// ForEach generates one row per fruit
ForEach(fruits, id: \.self) { fruit in
Text(fruit)
}
// Another static row below
Text("End of list")
.foregroundStyle(.secondary)
}
ForEach with identifiable struct
Listkabi, agar modelingizIdentifiablebo'lsaid:parametrni o'tkazib yuborishingiz mumkin. Bu haqiqiy SwiftUI kod bazalarida eng keng tarqalgan pattern.
struct Book: Identifiable {
let id = UUID()
let title: String
let author: String
}
List {
// No id: parameter needed β ForEach finds it via Identifiable
ForEach(books) { book in
Text(book.title)
}
}
ForEach with index using enumerated
Ma'lumot bilan birga qator raqamini ham olish uchun
.indicesishlating. Elementlar o'chirilishi mumkin bo'lgan ro'yxatlarda muammo chiqarishi mumkin β faqat o'qish uchun ro'yxatlarda ishlating.
List {
// indices gives you 0, 1, 2... β useful when you need the position
ForEach(fruits.indices, id: \.self) { index in
// Access the element using the index
Text("\(index + 1). \(fruits[index])")
}
}
Tezkor ma'lumotnoma
| Sintaksis | Vazifasi |
|---|---|
ForEach(massiv, id: \.self) | Hashable elementlar uchun |
ForEach(massiv) | Identifiable elementlar uchun |
ForEach(massiv.indices, id: \.self) | Indeks kerak bo'lganda |
.onDelete { indexSet in } | Swipe-to-delete β ForEach-ga qo'llanadi |
.onMove { from, to in } | Edit mode-da qayta tartiblash |
Topshiriq: tahrirlash mumkin ro'yxat
@State massiv yarating. List + ForEach bilan ko'rsating. .onDelete qo'shing. .onMove qo'shing. Toolbarga EditButton() qo'shing. Simulyatorda swipe-to-delete va drag-to-reorder-ni sinab ko'ring.