Sobes.tech
Middle+

Was ist PreferenceKey im Kontext der iOS-Entwicklung?

sobes.tech KI

Antwort von AI

PreferenceKey ist ein Protokoll in SwiftUI, das es ermöglicht, Werte von Kindansichten nach oben in der Ansichtshierarchie zu übertragen. Es wird verwendet, um Informationen über Größen, Positionen oder andere Eigenschaften der Kindansichten zu sammeln, die in Elternansichten für Layout- oder Verhaltensentscheidungen genutzt werden können.

Hauptkomponenten:

  1. Schlüssel (Key): Ein Typ, der das Protokoll PreferenceKey implementiert. Bestimmt den Werttyp, der übertragen wird, und wie mehrere Werte zusammengeführt werden (reduce Methode).
    struct MySizePreferenceKey: PreferenceKey {
        static var defaultValue: CGSize = .zero // Anfangswert
    
        static func reduce(value: inout CGSize, nextValue: () -> CGSize) {
            // Logik zum Zusammenführen der Werte.
            // In diesem Fall kann man die maximale Größe wählen oder summieren.
            // Beispiel: value = max(value, nextValue())
            // Beispiel zum Summieren: value.width += nextValue().width; value.height += nextValue().height
             value = nextValue() // Einfach den letzten Wert nehmen (zum Beispiel)
        }
    }
    
  2. Wert setzen: Die Kindansicht setzt den Wert mit dem Modifikator .preference(key:value:).
    Text("Hallo")
        .background(GeometryReader { geometry in
            Color.clear.preference(key: MySizePreferenceKey.self, value: geometry.size)
        })
    
  3. Wert lesen: Die Elternansicht liest den gesammelten Wert mit dem Modifikator .onPreferenceChange.
    VStack {
        // Kindansichten, die Präferenzen setzen
        Text("Beispiel 1")
            .background(GeometryReader { geometry in
                Color.clear.preference(key: MySizePreferenceKey.self, value: geometry.size)
            })
    
        Text("Beispiel 2 lang")
            .background(GeometryReader { geometry in
                Color.clear.preference(key: MySizePreferenceKey.self, value: geometry.size)
            })
    }
    .onPreferenceChange(MySizePreferenceKey.self) { size in
        // Hier kann die aggregierte Größe verwendet werden
        print("Aggregierte Größe:", size)
    }
    

Wann verwenden:

  • Erfassung der Größen von Kind-Elementen für eine adaptive Layoutgestaltung des Elternteils.
  • Übertragung von Positionsinformationen der Elemente.
  • Erstellung benutzerdefinierter Anker.
  • Sammlung von Zuständen oder Eigenschaften aus mehreren Kindansichten.

Unterschied zu Environment:

  • Environment überträgt Daten nach unten in der Ansichtshierarchie.
  • PreferenceKey überträgt Daten nach oben und ermöglicht das Sammeln/Zusammenführen von Werten aus mehreren Kindansichten.