Middle+
Mis on PreferenceKey SwiftUI kontekstis?
sobes.tech AI
Vastus AI-lt
PreferenceKey on protokoll SwiftUI-s, mis võimaldab väärtusi "alt üles" edasi saata puu kaudu. Seda kasutatakse teabe kogumiseks lastesõnumitest ja nende edastamiseks vanematele, kes saavad seda teavet kasutada oma käitumise või välimuse muutmiseks.
PreferenceKey peamised omadused:
- Protokoll: Peate rakendama
PreferenceKeyprotokolli, määrates väärtuse tüübi ja meetodi väärtuste ühendamiseks. associatedtype Value: Määrab edastatavate andmete tüübi.static func reduce(value: inout Value, nextValue: () -> Value): Seda meetodit kutsutakse SwiftUI poolt, kogudes väärtusi mitmest lastesõnumist. Te peate otsustama, kuidas ühendada praegune väärtus (value) ja uus (nextValue()).- Väärtuste edastamine: Lastesõnumid kasutavad
.preference(key:value:)modifikaatorit, et määrata konkreetsePreferenceKeyväärtus. - Väärtuste lugemine: Vanemad vaated kasutavad
.onPreferenceChange(_:perform:)modifikaatorit, et saada teateid väärtuse muutuste kohta.
Näide:
Loo PreferenceKey lapse vaate kõrguse määramiseks:
struct ChildHeightPreferenceKey: PreferenceKey {
// Väärtuse tüüp - valikuline Double, kuna lapse vaade võib veel mitte omada mõõtmeid
typealias Value = Double?
// Algväärtus
static var defaultValue: Double? = nil
// Väärtuste ühendamine (antud juhul võtame viimase mitte-tühja väärtuse)
static func reduce(value: inout Double?, nextValue: () -> Double?) {
value = nextValue() ?? value
}
}
Kasutamine vaates:
struct ParentView: View {
@State private var childHeight: Double? = nil
var body: some View {
VStack {
Text("Lapse vaate kõrgus: \(childHeight != nil ? "\(childHeight!)" : "-")")
ChildView()
// Väärtuse lugemine
.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äidiskõrgus
// Väärtuse määramine
.preference(key: ChildHeightPreferenceKey.self, value: geometry.size.height)
}
.frame(height: 100) // Fikseeritud raam GeometryReader jaoks
}
}