Sobes.tech
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:

  1. Clé (Key): Un type qui implémente le protocole PreferenceKey. Définit le type de valeur qui sera transmis et comment combiner plusieurs valeurs (reduce mé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)
        }
    }
    
  2. 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)
        })
    
  3. 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:

  • Environment transmet des données vers le bas dans la hiérarchie des vues.
  • PreferenceKey transmet des données vers le haut et permet de collecter/combiner des valeurs de plusieurs éléments enfants.