Sobes.tech
Middle+

Mi az a PreferenceKey az iOS fejlesztés kontextusában?

sobes.tech MI

Válasz az MI-től

A PreferenceKey egy protokoll SwiftUI-ban, amely lehetővé teszi az értékek továbbítását a gyermeknézetekből felfelé a nézethierarchiában. Általában a gyermeknézetek méreteiről, pozícióiról vagy más jellemzőiről gyűjt adatokat, amelyeket a szülőnézetekben a elrendezés vagy viselkedés döntéseihez lehet felhasználni.

Fő összetevők:

  1. Kulcs (Key): Egy típus, amely megvalósítja a PreferenceKey protokollt. Meghatározza az átadott érték típusát és hogyan lehet több értéket összegyűjteni (reduce módszer).
    struct MySizePreferenceKey: PreferenceKey {
        static var defaultValue: CGSize = .zero // Alapértelmezett érték
    
        static func reduce(value: inout CGSize, nextValue: () -> CGSize) {
            // Értékek összegzésének logikája.
            // Ebben az esetben kiválasztható a maximális méret vagy összeadás.
            // Példa: value = max(value, nextValue())
            // Összeadás példája: value.width += nextValue().width; value.height += nextValue().height
             value = nextValue() // Egyszerűen az utolsó értéket vesszük (például)
        }
    }
    
  2. Érték beállítása: A gyermeknézet a .preference(key:value:) módosítóval állítja be az értéket.
    Text("Helló")
        .background(GeometryReader { geometry in
            Color.clear.preference(key: MySizePreferenceKey.self, value: geometry.size)
        })
    
  3. Érték olvasása: A szülőnézet a gyűjtött értéket a .onPreferenceChange módosítóval olvassa.
    VStack {
        // Gyermeknézetek, amelyek preferenciákat állítanak be
        Text("Példa 1")
            .background(GeometryReader { geometry in
                Color.clear.preference(key: MySizePreferenceKey.self, value: geometry.size)
            })
    
        Text("Példa 2 hosszú")
            .background(GeometryReader { geometry in
                Color.clear.preference(key: MySizePreferenceKey.self, value: geometry.size)
            })
    }
    .onPreferenceChange(MySizePreferenceKey.self) { size in
        // Itt használhatja az összegzett méretet
        print("Összegzett méret:", size)
    }
    

Mikor használjuk:

  • Gyermekelemek méreteinek megszerzése az adaptív elrendezéshez.
  • Az elemek pozíciójáról szóló információk továbbítása.
  • Egyedi horgonyok (anchors) létrehozása.
  • Állapot vagy tulajdonságok gyűjtése több gyermeknézetből.

Különbség az Environment-től:

  • Az Environment adatokat lefelé továbbít a nézethierarchiában.
  • A PreferenceKey adatokat felfelé továbbít, és lehetővé teszi több gyermekelem értékeinek gyűjtését/egyesítését.