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:
- Schlüssel (Key): Ein Typ, der das Protokoll
PreferenceKeyimplementiert. Bestimmt den Werttyp, der übertragen wird, und wie mehrere Werte zusammengeführt werden (reduceMethode).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) } } - 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) }) - 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.