Middle+
SwiftUI bağlamında PreferenceKey nedir?
sobes.tech yapay zeka
AI'dan gelen yanıt
PreferenceKey, SwiftUI'da, görünümler ağacında "aşağıdan yukarıya" değer iletmeyi sağlayan bir protokoldür. Çocuk görünümlerden bilgi toplamaya ve bu bilgileri ebeveyn görünümlere iletmeye yarar; ebeveynler bu bilgileri kullanarak davranışlarını veya görünümünü değiştirebilirler.
PreferenceKey'in temel özellikleri:
- Protokol:
PreferenceKeyprotokolünü uygulamak gerekir; bu, değer tipi ve değerleri birleştirme yöntemi tanımlar. associatedtype Value: İletilecek veri türünü belirler.static func reduce(value: inout Value, nextValue: () -> Value): SwiftUI tarafından, birkaç çocuk görünümden alınan değerler toplanırken çağrılır. Burada, mevcut değer (value) ile yeni değer (nextValue()) nasıl birleştirileceği tanımlanır.- Değer iletimi: Çocuk görünümler, belirli bir
PreferenceKeyiçin değer ayarlamak üzere.preference(key:value:)modifikatorünü kullanır. - Değer okuma: Ebeveyn görünümler, belirli bir
PreferenceKey'in değer değişiklikleri hakkında bildirim almak için.onPreferenceChange(_:perform:)modifikatorünü kullanır.
Örnek:
Bir çocuk görünümünün yüksekliğini belirlemek için PreferenceKey oluşturma:
struct ChildHeightPreferenceKey: PreferenceKey {
// Değer tipi - Optional Double, çünkü çocuk görünüm henüz boyutlara sahip olmayabilir
typealias Value = Double?
// Varsayılan değer
static var defaultValue: Double? = nil
// Değerleri birleştirme (bu durumda, son boş olmayan değeri alır)
static func reduce(value: inout Double?, nextValue: () -> Double?) {
value = nextValue() ?? value
}
}
Kullanım örneği:
struct ParentView: View {
@State private var childHeight: Double? = nil
var body: some View {
VStack {
Text("Çocuk görünüm yüksekliği: \(childHeight != nil ? "\(childHeight!)" : "-")")
ChildView()
// PreferenceKey değerini okuma
.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) // Örnek yükseklik
// PreferenceKey değerini ayarlama
.preference(key: ChildHeightPreferenceKey.self, value: geometry.size.height)
}
.frame(height: 100) // GeometryReader için sabit çerçeve
}
}