Middle+
Ի՞նչ է PreferenceKey-ը SwiftUI-ի համատեքստում։
sobes.tech AI
Պատասխան AI-ից
PreferenceKey — դա SwiftUI-ում պրոտոկոլ է, որը թույլ է տալիս փոխանցել արժեքներ "վերից ներքև" ծառի միջոցով: Այն օգտագործվում է երեխաների ներկայացումների տեղեկատվությունը հավաքելու և այն փոխանցելու համար ծնողականներին, որոնք կարող են օգտագործել այդ տեղեկատվությունը իրենց վարքագիծը կամ տեսքը փոխելու համար:
PreferenceKey-ի հիմնական առանձնահատկությունները՝
- Պրոտոկոլ: Պետք է իրականացնել
PreferenceKeyպրոտոկոլը՝ սահմանելով արժեքի տիպը և արժեքների համակցման մեթոդը: associatedtype Value: Սահմանում է փոխանցվող տվյալների տիպը:static func reduce(value: inout Value, nextValue: () -> Value): Այս մեթոդը կանչվում է SwiftUI-ով՝ մի քանի երեխաների ներկայացումների արժեքները հավաքելու ժամանակ: Դուք պետք է որոշեք, թե ինչպես միավորել ընթացիկ արժեքը (value) և նոր արժեքը (nextValue()).- Արժեքների փոխանցում: Երեխաները օգտագործում են
.preference(key:value:)մոդիֆիկատորը՝ սահմանելու արժեքը կոնկրետPreferenceKey-ի համար: - Արժեքների ընթերցում: Ծնողները օգտագործում են
.onPreferenceChange(_:perform:)մոդիֆիկատորը՝ ստանալու ծանուցումներ արժեքի փոփոխության մասին:
Օրինակ:
Ստեղծել PreferenceKey՝ երեխայի ներկայացման բարձրությունը որոշելու համար:
struct ChildHeightPreferenceKey: PreferenceKey {
// Արժեքի տիպը՝ Optional Double, քանի որ երեխայի ներկայացումը դեռ կարող է չունենալ չափեր
typealias Value = Double?
// Դեֆոլտ արժեքը
static var defaultValue: Double? = nil
// Արժեքների միավորում (այստեղ՝ վերցնում ենք վերջին ոչ դատարկ արժեքը)
static func reduce(value: inout Double?, nextValue: () -> Double?) {
value = nextValue() ?? value
}
}
Օգտագործում ներկայացման մեջ:
struct ParentView: View {
@State private var childHeight: Double? = nil
var body: some View {
VStack {
Text("Երեխայի ներկայացման բարձրությունը՝ \(childHeight != nil ? "\(childHeight!)" : "-")")
ChildView()
// Արժեքի ընթերցում
.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) // Օրինակ բարձրություն
// Արժեք սահմանել `PreferenceKey`-ի համար
.preference(key: ChildHeightPreferenceKey.self, value: geometry.size.height)
}
.frame(height: 100) // Fix frame for GeometryReader
}
}