Middle+
Kas ir PreferenceKey SwiftUI kontekstā?
sobes.tech AI
Atbilde no AI
PreferenceKey ir protokols SwiftUI, kas ļauj pārsūtīt vērtības "no apakšas uz augšu" caur skatu koku. To izmanto, lai savāktu informāciju no bērnu skatiem un nodotu to vecāku skatiem, kas var izmantot šo informāciju, lai mainītu savu uzvedību vai izskatu.
PreferenceKey galvenās īpašības:
- Protokols: Jums jāīsteno
PreferenceKeyprotokols, definējot vērtības tipu un metodi vērtību apvienošanai. associatedtype Value: Nosaka pārsūtāmo datu tipu.static func reduce(value: inout Value, nextValue: () -> Value): Šī metode tiek izsaukta SwiftUI, savācot vērtības no vairākiem bērnu skatiem. Jums jānosaka, kā apvienot pašreizējo vērtību (value) ar jauno (nextValue()).- Vērtību pārsūtīšana: Bērnu skati izmanto
.preference(key:value:)modifikatoru, lai iestatītu vērtību konkrētamPreferenceKey. - Vērtību lasīšana: Vecāku skati izmanto
.onPreferenceChange(_:perform:)modifikatoru, lai saņemtu paziņojumus par vērtības izmaiņām.
Piemērs:
Izveidojiet PreferenceKey bērna skata augstuma noteikšanai:
struct ChildHeightPreferenceKey: PreferenceKey {
// Vērtības tips - opcijais Double, jo bērna skats vēl var nebūt izmēri
typealias Value = Double?
// Sākotnējā vērtība
static var defaultValue: Double? = nil
// Vērtību apvienošana (šajā gadījumā, ņemam pēdējo nepilnu vērtību)
static func reduce(value: inout Double?, nextValue: () -> Double?) {
value = nextValue() ?? value
}
}
Izmantošanā skata iekšpusē:
struct ParentView: View {
@State private var childHeight: Double? = nil
var body: some View {
VStack {
Text("Bērna skata augstums: \(childHeight != nil ? "\(childHeight!)" : "-")")
ChildView()
// Vērtības lasīšana
.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) // Piemēra augstums
// Vērtības iestatīšana
.preference(key: ChildHeightPreferenceKey.self, value: geometry.size.height)
}
.frame(height: 100) // Fiksēts rāmis GeometryReader
}
}