Published on

List, ForEach yoki ScrollView: qaysi birini tanlash kerak

Authors

Hozirgacha List, ForEach va ehtimol ScrollView haqida eshitgansiz. Ular barchasi viewlar to'plamini ko'rsatishni o'z ichiga oladi, shuning uchun noto'g'risini tanlash va nima uchun ishlayotgani yo'qligini hayron bo'lib o'ylash oson. Bu dars yangi API yo'q β€” faqat ravshanlΔ±k. Har bir yondashuvning nima qilib, nima qilmasligini, noto'g'ri tanlaganda qanday xatolar yuzaga kelishini va yangi ekran boshlaganingizda o'zingizga beradigan oddiy savollarni ko'rasiz.

Buni erta to'g'ri tushunish keyinchalik ko'p debug vaqtini tejaydi. ScrollView + ForEach kerak bo'lganida List tanlash yoki aksincha β€” tushunarsiz layoutdagi muammolarga olib keladi.

Swift
List β€” standart iOS ro'yxat xususiyatlari kerak bo'lganda
import SwiftUI struct ContentView: View { let kontaktlar = ["Alisher", "Bobur", "Dildora", "Jasur"] var body: some View { NavigationStack { // List β€” swipe amallari, edit mode, NavigationLink kerak bo'lganda to'g'ri tanlov List(kontaktlar, id: \.self) { kontakt in NavigationLink(kontakt, value: kontakt) } .navigationDestination(for: String.self) { ism in Text(ism).navigationTitle(ism) } .navigationTitle("Kontaktlar") } } }

Uch vosita bir ko'rinishda

VositaNimaNima beradi
ListQator uslubi bilan scrollable konteynerSeparatorlar, swipe amallari, edit mode, selection, pull-to-refresh, bo'lim sarlavhalari β€” barchasi avtomatik
ForEachFaqat view yaratuvchi sikl β€” konteyner emasFaqat generatsiya qilingan view-lar. Konteyner (List, VStack, ScrollView) ichiga joylashtirilishi shart
ScrollViewQator uslubisiz scrollable konteynerScroll va to'liq layout nazorati. Spacing, ajratgich va interaksiyani o'zingiz boshqarasiz

Qaysi birini ishlating

List qachon

// List quyidagilar kerak bo'lganda to'g'ri tanlov:
// - Swipe-to-delete yoki maxsus swipe amallari
// - Edit mode, selection yoki qayta tartiblash
// - Pull-to-refresh
// - Standart viewdagi bo'lim sarlavhalari
// - NavigationLink qatorlari
List(kontaktlar) { kontakt in
    NavigationLink(kontakt.ism, value: kontakt)
}
.swipeActions { /* ... */ }
.refreshable { await yuklash() }

ScrollView + ForEach qachon

// ScrollView quyidagilar kerak bo'lganda to'g'ri:
// - Maxsus karta layoutlari (qator separatorlari yoki inset uslubi yo'q)
// - Gorizontal scroll
// - Aralash kontent turlari (bannerlar, kartalar, matn, rasmlar)
// - Spacing va vizual uslub ustida to'liq nazorat
ScrollView {
    VStack(spacing: 16) {
        ForEach(retseptlar) { retsept in
            RetseptKartasi(retsept: retsept)
        }
    }
    .padding()
}

ForEach yolg'iz qachon

// ForEach yolg'iz (ScrollView yoki List wrappersiz) qachon to'g'ri:
// - Form, Group yoki HStack ichida view-lar generatsiya qilishda
// - Ota-ona konteyner allaqachon layout va scrollni boshqarayotganda
// - Generatsiya qilingan va statik view-larni bir blokda aralashtirishda
Form {
    Section("Teglar") {
        // ForEach mavjud Form konteyneri ichida Toggle qatorlari generatsiya qiladi
        ForEach(teglar) { teg in
            Toggle(teg.nomi, isOn: $teg.tanlangan)
        }
    }
}

Umumiy xatolar

XatoNima bo'ladiYechim
To'liq layout nazorati kerak bo'lganda List ishlatishQator separatorlari, inset marginslar va tizim uslubi istamaganingizda paydo bo'ladiScrollView + VStack + ForEach ga o'ting
ScrollView + ForEach ga swipe-to-delete qo'shishKo'p kod, izchilsiz ko'rinish, tizim xatti-harakati bilan mos kelmaydi.onDelete bilan List ishlatish
List ni ScrollView ichiga joylashLayout buziladi, scroll ziddiyatlari, oldindan aytib bo'lmaydigan balandliklarList-ni hech qachon ScrollView ichiga joylamang
Uzun kontent uchun ForEach-ni scrollable konteynerda ishlatmaslikKontent ekrandan tashqariga chiqib ketadi, scroll yo'qScrollView yoki List-ga o'rang
List selection kerak bo'lganda ScrollView ishlatishSelection ajratish va edit mode ishlamaydiList(selection:) ishlating

Vaziyat bo'yicha eng yaxshi tanlov

VaziyatEng yaxshi tanlov
Toggle va navigatsiya havolalari bilan sozlamalar ekraniList
Maxsus spacing bilan foto kartalar sotsial feedScrollView + VStack + ForEach
Gorizontal aylanish karuseliScrollView(.horizontal) + HStack + ForEach
Swipe-to-complete va delete bilan vazifalar ro'yxatiList
Form bo'limi ichida Toggle qatorlariForEach Form Section ichida (wrapper shart emas)
Rasm thumbnail gridiLazyVGrid (Stage 9-da o'rganiladi)
A–Z bo'lim sarlavhalari bilan kontaktlar ro'yxatiHar harf uchun Section bilan List

Stage 5 xulosa: ro'yxatlar va ma'lumotlarni ko'rsatish

Real iOS ilovasi markazida deyarli har doim ma'lumotlar ko'rsatish qatlami bo'ladi β€” va endi siz uni qurishni bilasiz.

MavzuAsosiy fikr
List AsoslariiOS ro'yxat uslumida scrollable konteyner. Identifiable struct-lar bilan yoki id: bilan ishlating. .listStyle bilan uslubni o'zgartiring.
ForEachView generator β€” konteyner emas. List, VStack yoki ScrollView ichiga joylashtiring. .onDelete va .onMove ForEach-ga qo'llaniladi.
Maxsus QatorlarHar bir qator uchun alohida view struct. HStack + VStack kombinatsiyasi va Spacer() bilan professional patternlar.
Bo'limlarSection bilan tegishli qatorlarni guruhlang. Sarlavha va pastki sarlavha qo'shing. .insetGrouped iOS standart ko'rinishi.
Swipe Amallari.onDelete standart o'chirish uchun, .swipeActions maxsus tugmalar uchun. EditButton() edit mode-ni yoqadi.
Tortib Yangilash.refreshable { await ... } β€” spinner, gesture va kutish avtomatik. async/await to'liq Stage 8-da.
To'g'ri Vositani TanlashList β€” tizim xususiyatlari kerak bo'lganda; ScrollView+ForEach β€” maxsus layout; ForEach yolg'iz β€” mavjud konteyner ichida.

Topshiriqlardan birini o'tkazib yuborgan bo'lsangiz, qaytib bajaring β€” barchasi bitta kitoblar ro'yxati loyihasining davomi va har biri oldingilarning ustiga quriladi.

Keyingi: Stage 6 β€” Formalar va Foydalanuvchi Kirishi. Matn yig'ish, sozlamalarni almashtirish, sanalarni tanlash va har bir ilova uchun zarur bo'lgan ma'lumot kiritish ekranlarini qurish.

Buy mea coffee