Middle+
Qu'est-ce que PreferenceKey dans le contexte du développement iOS?
sobes.tech IA
Réponse de l'IA
PreferenceKey est un protocole dans SwiftUI qui permet de transmettre des valeurs des vues enfants vers le haut dans la hiérarchie des vues. Il est utilisé pour collecter des informations sur les tailles, positions ou autres caractéristiques des vues enfants, qui peuvent être utilisées dans les vues parentales pour prendre des décisions de mise en page ou de comportement.
Composants principaux:
- Clé (Key): Un type qui implémente le protocole
PreferenceKey. Définit le type de valeur qui sera transmis et comment combiner plusieurs valeurs (reduceméthode).struct MySizePreferenceKey: PreferenceKey { static var defaultValue: CGSize = .zero // Valeur par défaut static func reduce(value: inout CGSize, nextValue: () -> CGSize) { // Logique de fusion des valeurs. // Dans ce cas, on peut choisir la taille maximale ou additionner. // Exemple: value = max(value, nextValue()) // Exemple pour additionner: value.width += nextValue().width; value.height += nextValue().height value = nextValue() // Prend simplement la dernière valeur (pour l'exemple) } } - Définir la valeur: La vue enfant définit la valeur à l'aide du modificateur
.preference(key:value:).Text("Bonjour") .background(GeometryReader { geometry in Color.clear.preference(key: MySizePreferenceKey.self, value: geometry.size) }) - Lire la valeur: La vue parent lit la valeur collectée à l'aide du modificateur
.onPreferenceChange.VStack { // Vues enfants qui définissent des préférences Text("Exemple 1") .background(GeometryReader { geometry in Color.clear.preference(key: MySizePreferenceKey.self, value: geometry.size) }) Text("Exemple 2 long") .background(GeometryReader { geometry in Color.clear.preference(key: MySizePreferenceKey.self, value: geometry.size) }) } .onPreferenceChange(MySizePreferenceKey.self) { size in // Ici, on peut utiliser la taille agrégée print("Taille agrégée:", size) }
Quand utiliser:
- Obtenir les tailles des éléments enfants pour une mise en page adaptative du parent.
- Transmettre des informations sur la position des éléments.
- Créer des ancres personnalisées.
- Collecter l'état ou les propriétés de plusieurs vues enfants.
Différence avec Environment:
Environmenttransmet des données vers le bas dans la hiérarchie des vues.PreferenceKeytransmet des données vers le haut et permet de collecter/combiner des valeurs de plusieurs éléments enfants.