- Published on
Ekranlar o'rtasida data o'tkazish
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
Ekranlar o'rtasida data o'tkazish
Navigatsiya β ekranlar o'rtasida harakat. Data oqimi β siz bilan nima sayohat qiladi. Bu ikkita mavzu shu yerda birlashadi β yangi ekranga qanday push qilishni tushunish β bu rasmning faqat yarmi. Ikkinchi yarmi β to'g'ri data u yerga yetib borishini ta'minlash va o'zgarishlarni orqaga qaytarishni bilishdir.
Data ekranlar o'rtasida ikki yo'nalishda harakat qiladi. Oldinga β oddiy: bir joyga borasiz va kerakli narsani o'zingiz bilan olasiz β xuddi funksiyaga parametr berishga o'xshaydi. Orqaga β qiyinroq: detail ekran ota-onaga biror narsa o'zgarganini aytishi kerak. Aynan mana shu yerda @Binding va @Environment(\.dismiss) kerak bo'ladi.
Bu dars Stage 4-dagi barcha navigatsiya patternlarini Stage 2-dan data oqimi tushunchalari bilan birlashtiradi. Har ikkala yo'nalishni haqiqiy misol bilan ko'rib chiqamiz.
Data yo'nalishi patternlari
Oldinga: let (faqat o'qish uchun data o'tkazish)
// Ota-ona qiymat o'tkazadi β child o'qinadigan nusxa oladi
NavigationLink("Detallarni ko'rish") {
DetailView(element: tanlananElement)
}
struct DetailView: View {
// let = doimiy, o'zgartirib bo'lmaydi β bu faqat ko'rsatish uchun data
let element: Element
var body: some View {
Text(element.nomi)
}
}
Destination datani tahrirlash emas, faqat ko'rsatish kerak bo'lganda oddiy let xususiyatdan foydalaning. Bu eng oddiy pattern va to'g'ri default β faqat o'zgarishlar orqaga qaytishi kerak bo'lganda @Binding ga o'ting.
Orqaga: @Binding (tahrirlash mumkin data o'tkazish)
// Ota-ona dataga @State bilan egalik qiladi
@State private var isEnabled = true
// Binding bering β sheet bu qiymatni o'zgartira olsin
.sheet(isPresented: $showSettings) {
SozlamalarSheet(isEnabled: $isEnabled)
}
struct SozlamalarSheet: View {
@Binding var isEnabled: Bool
var body: some View {
// Toggle ota-ona @State-ga binding orqali yozadi
Toggle("Funksiyani yoqish", isOn: $isEnabled)
.padding()
}
}
@Binding ota-ona @State ga ikki tomonlama ulanish yaratadi. Child view qiymatni o'qishi va yozishi mumkin, o'zgarishlar @State ishlatilgan hamma joyga tarqaladi β ota-onaga qaytib ham.
Data qaytarmasdan yopish
struct ElementQoshishSheet: View {
@Environment(\.dismiss) var dismiss
var body: some View {
VStack {
Text("Yangi element qo'shish")
Button("Tayyor") {
// Datani saqlang, keyin yoping
dismiss()
}
}
}
}
Sheet yoki taqdim etilgan view ma'lum qiymat qaytarmasdan yopilishi kerak bo'lganda β @Environment(\.dismiss) to'g'ri vosita. U qanday taqdim etilganidan qat'i nazar bu view-ni olib tashlashni taqdimot tizimidan so'raydi.
Swift'da yangimisiz?: Qiymat uzatish va binding uzatish o'rtasidagi farq β kimgadur fotokopiya berish bilan originalga yozishga ruxsat berish o'rtasidagi farq kabi. Oddiy qiymat (
let username: String) β nusxa, o'zgarishlar lokal qoladi. Binding (@Binding var username: String) β originalga ishora, o'zgarishlar ulashiladi.
Tezkor ma'lumotnoma
| Pattern | Qachon ishlating |
|---|---|
let xususiyat destination-da | Faqat ko'rsatish, tahrirlash kerak bo'lmagan data o'tkazishda |
@Binding destination-da + $qiymat chaqiruv joyida | Destination ota-ona datani o'zgartirish kerak bo'lganda |
@Environment(\.dismiss) + dismiss() | Modal/sheet-ni ichidan yopish, data qaytarish shart emas |
Ota-onada @State + child-da @Binding | Ota-ona dataga egalik qiladi, child uni tahrirlaydi β kanonik pattern |
Topshiriq: ma'lumot aylanishi
Ro'yxat view yarating: unda odamning ismi va yoshi ko'rinsin. "Tahrirlash" tugmasi sheet ochsin. Sheet ichida ikkita matn maydoni bo'lsin β ism uchun va yosh uchun β ota-ona @State-ga qayta bog'langan holda, shunda sheet yopilganda ro'yxatdagi o'zgarishlar darhol ko'rinsin. Simulyatorda sinab ko'ring va ma'lumot to'g'ri aylanishini tekshiring.
Stage 4 xulosa: navigatsiya
SwiftUI-dagi barcha muhim navigatsiya patternlarini o'rgandingiz β va endi ilovalaringizda bir-biri bilan haqiqatan bog'langan bir nechta ekran bo'lishi mumkin. Bu katta va muhim qadam.
| Mavzu | Asosiy fikr |
|---|---|
| NavigationStack | Push/pop navigatsiyaning asosi. Kontentingizni NavigationStack-ga o'rang, .navigationTitle, .toolbar va .toolbarBackground bilan nav bar-ni bezang. |
| NavigationLink | Yangi view-ni push qiladigan tugma. Oddiy matn label, maxsus label closure, yoki data-driven navigatsiya uchun zamonaviy .navigationDestination(for:) patternidan foydalaning. |
| Dasturiy Navigatsiya | NavigationPath koddan navigatsiyani boshqarish imkonini beradi β ekranlarni push qilish uchun qiymat qo'shing, orqaga qaytish uchun removeLast chaqiring, foydalanuvchi tepishisiz ildizga qaytish uchun path-ni bo'shating. |
| Sheet va fullScreenCover | Pastdan yuqoriga ko'tariladigan modal taqdimotlar. Bool yoki ixtiyoriy elementga bog'lang, ichidan yopish uchun @Environment(\.dismiss) ishlating. |
| Alert va confirmationDialog | Alert β 1β2 tugmali favqulodda tasdiqlash uchun; confirmationDialog β 3+ tanlov uchun. Xavfli amallar uchun role: .destructive, chiqish yo'li uchun role: .cancel ishlating. |
| TabView | Yonma-yon bo'lim navigatsiyasi. Har bir tabga .tabItem, o'z NavigationStack-i va dasturiy almashtirish kerak bo'lganda .tag() hamda selection binding kerak. |
| Ekranlar O'rtasida Data | Datani oldinga oddiy let bilan, orqaga @Binding bilan o'tkazing. Faqat yopish kerak bo'lsa @Environment(\.dismiss) ishlating. Ota-ona har doim dataga @State bilan egalik qiladi. |
Agar hali qilmagan bo'lsangiz, simulyatorda ushbu stage-ning topshiriqlaridan birini ishga tushiring. Ekranlar orasida o'tish, detail view-larni push qilish, sheet-larni yopish β bularni haqiqiy ishlaydigan ilovada his qilish kerak, shundagina yaxshi o'zlashadi.
Keyingi: Stage 5 β Ro'yxatlar va Ma'lumotlarni Ko'rsatish. Haqiqiy datani olasiz va uni ro'yxatlar, grid-lar va scroll view-larda samarali ko'rsatishni o'rganasiz.