Sobes.tech
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: PreferenceKey protokolunu 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 bir PreferenceKey üçü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 bir PreferenceKey-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ə
    }
}