Published on

Ekranlar o'rtasida data o'tkazish

Authors

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.

Swift
ContentView.swift
import SwiftUI struct ContentView: View { // @State foydalanuvchi nomiga egalik qiladi β€” haqiqat manbai @State private var username = "Alex" var body: some View { NavigationStack { VStack(spacing: 20) { Text("Salom, \(username)") .font(.title) // EditView-ga ota-ona @State-ga yozishi uchun binding bering NavigationLink("Profilni tahrirlash") { EditView(username: $username) } } .navigationTitle("Bosh sahifa") } } } struct EditView: View { // @Binding ota-ona @State-ga ulanadi β€” bu erdagi o'zgarishlar ota-onaga qaytadi @Binding var username: String var body: some View { VStack { // TextField binding oladi β€” foydalanuvchi terishi bilan darhol yangilanadi TextField("Foydalanuvchi nomi", text: $username) .textFieldStyle(.roundedBorder) .padding() Text("Ko'rinish: \(username)") } .navigationTitle("Profilni tahrirlash") .navigationBarTitleDisplayMode(.inline) } }

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

PatternQachon ishlating
let xususiyat destination-daFaqat ko'rsatish, tahrirlash kerak bo'lmagan data o'tkazishda
@Binding destination-da + $qiymat chaqiruv joyidaDestination 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 @BindingOta-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.

MavzuAsosiy fikr
NavigationStackPush/pop navigatsiyaning asosi. Kontentingizni NavigationStack-ga o'rang, .navigationTitle, .toolbar va .toolbarBackground bilan nav bar-ni bezang.
NavigationLinkYangi view-ni push qiladigan tugma. Oddiy matn label, maxsus label closure, yoki data-driven navigatsiya uchun zamonaviy .navigationDestination(for:) patternidan foydalaning.
Dasturiy NavigatsiyaNavigationPath 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 fullScreenCoverPastdan yuqoriga ko'tariladigan modal taqdimotlar. Bool yoki ixtiyoriy elementga bog'lang, ichidan yopish uchun @Environment(\.dismiss) ishlating.
Alert va confirmationDialogAlert β€” 1–2 tugmali favqulodda tasdiqlash uchun; confirmationDialog β€” 3+ tanlov uchun. Xavfli amallar uchun role: .destructive, chiqish yo'li uchun role: .cancel ishlating.
TabViewYonma-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 DataDatani 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.

Buy mea coffee