Sobes.tech
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:

  1. Kľúč (Key): Typ, ktorý implementuje protokol PreferenceKey. Určuje typ hodnoty, ktorá bude prenášaná, a spôsob zlúčenia viacerých hodnôt (reduce metó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)
        }
    }
    
  2. 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)
        })
    
  3. Čí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:

  • Environment prenáša údaje dolu hierarchiou zobrazení.
  • PreferenceKey prenáša údaje hore hierarchiou zobrazení a umožňuje zbieranie/zlučovanie hodnôt z viacerých dcérskych prvkov.