Sobes.tech
Middle+

SwiftUI kontekstida PreferenceKey nima?

sobes.tech AI

AIdan javob

PreferenceKey SwiftUI'da, ko'rinish daraxti bo'ylab "pastdan yuqoriga" qiymatlarni uzatishga imkon beradigan protokoldir. Bu, bolalar ko'rinishlaridan ma'lumotlarni yig'ish va ularni ota-ona ko'rinishlariga yetkazish uchun ishlatiladi, ular bu ma'lumotlarni o'z xulq-atvori yoki tashqi ko'rinishini o'zgartirish uchun ishlatishi mumkin.

PreferenceKey ning asosiy xususiyatlari:

  • Protokol: PreferenceKey protokolini amalga oshirish kerak, bu qiymat turi va ularni birlashtirish usulini belgilaydi.
  • associatedtype Value: Uzatiladigan ma'lumotlar turini belgilaydi.
  • static func reduce(value: inout Value, nextValue: () -> Value): Bu metod SwiftUI tomonidan, bir nechta bolalar ko'rinishlaridan qiymatlarni yig'ishda chaqiriladi. Siz hozirgi qiymat (value) bilan yangi (nextValue()) qanday birlashtirilishini belgilashingiz kerak.
  • Qiymatlarni uzatish: Bolalar ko'rinishlar .preference(key:value:) modifikatoridan foydalanib, ma'lum bir PreferenceKey uchun qiymat o'rnatadilar.
  • Qiymatlarni o'qish: Ota-ona ko'rinishlar .onPreferenceChange(_:perform:) modifikatoridan foydalanib, ma'lum bir PreferenceKey qiymatining o'zgarishlari haqida bildirish oladilar.

Misol:

Bolalar ko'rinishining balandligini aniqlash uchun PreferenceKey yaratish:

struct ChildHeightPreferenceKey: PreferenceKey {
    // Qiymat turi - Optional Double, chunki bolalar ko'rinishi hali o'lchamlarga ega bo'lmasligi mumkin
    typealias Value = Double?

    // Standart qiymat
    static var defaultValue: Double? = nil

    // Qiymatlarni birlashtirish (bu holatda, oxirgi bo'sh bo'lmagan qiymatni olamiz)
    static func reduce(value: inout Double?, nextValue: () -> Double?) {
        value = nextValue() ?? value
    }
}

Foydalanish:

struct ParentView: View {
    @State private var childHeight: Double? = nil

    var body: some View {
        VStack {
            Text("Bolalar ko'rinishining balandligi: \(childHeight != nil ? "\(childHeight!)" : "-")")
            ChildView()
                // PreferenceKey qiymatini o'qish
                .onPreferenceChange(ChildHeightPreferenceKey.self) { newValue in
                    self.childHeight = newValue
                }
        }
    }
}

struct ChildView: View {
    var body: some View {
        GeometryReader { geometry in
            Rectangle()
                .fill(Color.blue)
                .frame(height: 100) // Misol uchun balandlik
                // PreferenceKey qiymatini o'rnatish
                .preference(key: ChildHeightPreferenceKey.self, value: geometry.size.height)
        }
        .frame(height: 100) // GeometryReader uchun statik ramka
    }
}