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:
PreferenceKeyprotokolini 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 birPreferenceKeyuchun qiymat o'rnatadilar. - Qiymatlarni o'qish: Ota-ona ko'rinishlar
.onPreferenceChange(_:perform:)modifikatoridan foydalanib, ma'lum birPreferenceKeyqiymatining 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
}
}