Sobes.tech
Middle+

¿Qué es PreferenceKey en el contexto del desarrollo en iOS?

sobes.tech AI

Respuesta de la IA

PreferenceKey es un protocolo en SwiftUI que permite transmitir valores desde vistas hijas hacia arriba en la jerarquía de vistas. Se usa para recopilar información sobre tamaños, posiciones u otras características de las vistas hijas, que puede ser utilizada en vistas parentales para tomar decisiones de diseño o comportamiento.

Componentes principales:

  1. Clave (Key): Un tipo que implementa el protocolo PreferenceKey. Define el tipo de valor que se transmitirá y cómo combinar múltiples valores (reduce método).
    struct MySizePreferenceKey: PreferenceKey {
        static var defaultValue: CGSize = .zero // Valor inicial
    
        static func reduce(value: inout CGSize, nextValue: () -> CGSize) {
            // Lógica para combinar valores.
            // En este caso, se puede elegir el tamaño máximo o sumar.
            // Ejemplo: value = max(value, nextValue())
            // Ejemplo para sumar: value.width += nextValue().width; value.height += nextValue().height
             value = nextValue() // Simplemente tomamos el último valor (como ejemplo)
        }
    }
    
  2. Establecer valor: La vista hija establece el valor usando el modificador .preference(key:value:).
    Text("Hola")
        .background(GeometryReader { geometry in
            Color.clear.preference(key: MySizePreferenceKey.self, value: geometry.size)
        })
    
  3. Leer valor: La vista parental lee el valor recopilado usando el modificador .onPreferenceChange.
    VStack {
        // Vistas hijas que establecen preferencias
        Text("Ejemplo 1")
            .background(GeometryReader { geometry in
                Color.clear.preference(key: MySizePreferenceKey.self, value: geometry.size)
            })
    
        Text("Ejemplo 2 largo")
            .background(GeometryReader { geometry in
                Color.clear.preference(key: MySizePreferenceKey.self, value: geometry.size)
            })
    }
    .onPreferenceChange(MySizePreferenceKey.self) { size in
        // Aquí se puede usar el tamaño agregado
        print("Tamaño agregado:", size)
    }
    

Cuándo usar:

  • Obtener tamaños de elementos hijos para un diseño adaptable del padre.
  • Transmitir información sobre la posición de los elementos.
  • Crear anclajes personalizados.
  • Recopilar estado o propiedades de varias vistas hijas.

Diferencia con Environment:

  • Environment pasa datos hacia abajo en la jerarquía de vistas.
  • PreferenceKey pasa datos hacia arriba en la jerarquía y permite recopilar/combinar valores de varios elementos hijos.