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:
- Kulcs (Key): Egy típus, amely megvalósítja a
PreferenceKeyprotokollt. Meghatározza az átadott érték típusát és hogyan lehet több értéket összegyűjteni (reducemó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) } } - É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) }) - Érték olvasása: A szülőnézet a gyűjtött értéket a
.onPreferenceChangemó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
Environmentadatokat lefelé továbbít a nézethierarchiában. - A
PreferenceKeyadatokat felfelé továbbít, és lehetővé teszi több gyermekelem értékeinek gyűjtését/egyesítését.