Middle+
Čo je PreferenceKey v kontexte vývoja na iOS?
sobes.tech AI
Odpoveď od AI
PreferenceKey je protokol v SwiftUI, ktorý umožňuje prenášať hodnoty z dcérskych zobrazení nahor po hierarchii zobrazení. Používa sa na zber informácií o veľkostiach, polohe alebo iných vlastnostiach dcérskych zobrazení, ktoré možno použiť v rodičovských zobrazeniach na rozhodovanie o rozložení alebo správaní.
Hlavné komponenty:
- Kľúč (Key): Typ, ktorý implementuje protokol
PreferenceKey. Určuje typ hodnoty, ktorá bude prenášaná, a spôsob zlúčenia viacerých hodnôt (reducemetóda).struct MySizePreferenceKey: PreferenceKey { static var defaultValue: CGSize = .zero // Počiatočná hodnota static func reduce(value: inout CGSize, nextValue: () -> CGSize) { // Logika zlúčenia hodnôt. // V tomto prípade možno zvoliť maximálnu veľkosť alebo sčítanie. // Príklad: value = max(value, nextValue()) // Príklad pre sčítanie: value.width += nextValue().width; value.height += nextValue().height value = nextValue() // Jednoducho vezmeme poslednú hodnotu (pre príklad) } } - Nastavenie hodnoty: Dcérske zobrazenie nastaví hodnotu pomocou modifikátora
.preference(key:value:).Text("Ahoj") .background(GeometryReader { geometry in Color.clear.preference(key: MySizePreferenceKey.self, value: geometry.size) }) - Čítanie hodnoty: Rodičovské zobrazenie číta zozbieranú hodnotu pomocou modifikátora
.onPreferenceChange.VStack { // Dcérske zobrazenia nastavujúce preferencie Text("Príklad 1") .background(GeometryReader { geometry in Color.clear.preference(key: MySizePreferenceKey.self, value: geometry.size) }) Text("Dlhý príklad") .background(GeometryReader { geometry in Color.clear.preference(key: MySizePreferenceKey.self, value: geometry.size) }) } .onPreferenceChange(MySizePreferenceKey.self) { size in // Tu možno použiť agregovanú veľkosť print("Agregovaná veľkosť:", size) }
Kedy použiť:
- Získanie veľkostí dcérskych prvkov pre adaptívne rozloženie rodiča.
- Prenos informácií o rozložení prvkov.
- Vytváranie vlastných kotiev (anchors).
- Zber stavu alebo vlastností z viacerých dcérskych zobrazení.
Rozdiel od Environment:
Environmentprenáša údaje dolu hierarchiou zobrazení.PreferenceKeyprenáša údaje hore hierarchiou zobrazení a umožňuje zbieranie/zlučovanie hodnôt z viacerých dcérskych prvkov.