Middle+
SwiftUI kontekstində PreferenceKey nədir?
sobes.tech Süni İntellekt
AI-dan cavab
PreferenceKey SwiftUI-də, görünüş ağacında "aşağıdan yuxarıya" dəyərləri ötürməyə imkan verən protokoldur. Bu, uşaqların görünüşlərindən məlumat toplamaq və onları valideyn görünüşlərinə çatdırmaq üçün istifadə olunur, bu məlumatlar isə öz davranışlarını və ya görünüşlərini dəyişdirmək üçün istifadə edilə bilər.
PreferenceKey-in əsas xüsusiyyətləri:
- Protokol:
PreferenceKeyprotokolunu həyata keçirmək lazımdır, burada dəyər tipi və dəyərlərin birləşdirilməsi metodu müəyyən edilir. associatedtype Value: Keçiriləcək məlumatın növünü müəyyən edir.static func reduce(value: inout Value, nextValue: () -> Value): Bu metod SwiftUI tərəfindən, bir neçə uşağın görünüşündən alınan dəyərləri toplamaq üçün çağırılır. Burada, mövcud dəyər (value) ilə yeni dəyər (nextValue()) necə birləşdiriləcəyini müəyyən etməlisiniz.- Dəyərlərin ötürülməsi: Uşaqlar görünüşləri
.preference(key:value:)modifikatorundan istifadə edərək, müəyyən birPreferenceKeyüçün dəyər təyin edir. - Dəyərlərin oxunması: Valideyn görünüşləri
.onPreferenceChange(_:perform:)modifikatorundan istifadə edərək, müəyyən birPreferenceKey-in dəyərinin dəyişiklikləri barədə bildiriş alır.
Nümunə:
Uşağın görünüşünün hündürlüyünü müəyyən etmək üçün PreferenceKey yaradılması:
struct ChildHeightPreferenceKey: PreferenceKey {
// Dəyər tipi - Optional Double, çünki uşağın görünüşü hələ ölçülərə malik olmaya bilər
typealias Value = Double?
// Əsas dəyər
static var defaultValue: Double? = nil
// Dəyərlərin birləşdirilməsi (bu halda, son qeyri-boş dəyəri götürürük)
static func reduce(value: inout Double?, nextValue: () -> Double?) {
value = nextValue() ?? value
}
}
İstifadə görünüşündə:
struct ParentView: View {
@State private var childHeight: Double? = nil
var body: some View {
VStack {
Text("Uşağın görünüşünün hündürlüyü: \(childHeight != nil ? "\(childHeight!)" : "-")")
ChildView()
// PreferenceKey dəyərini oxumaq
.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) // Nümunə hündürlük
// PreferenceKey dəyərini təyin etmək
.preference(key: ChildHeightPreferenceKey.self, value: geometry.size.height)
}
.frame(height: 100) // GeometryReader üçün sabit çərçivə
}
}