Sobes.tech
Middle+

Wat is een PreferenceKey in de context van iOS-ontwikkeling?

sobes.tech AI

Antwoord van AI

PreferenceKey is een protocol in SwiftUI dat het mogelijk maakt om waarden van kindweergaven naar boven in de hiërarchie van weergaven te sturen. Het wordt gebruikt om informatie te verzamelen over afmetingen, posities of andere kenmerken van kindweergaven, die in ouderweergaven kunnen worden gebruikt voor lay-out- of gedragsbeslissingen.

Belangrijkste componenten:

  1. Sleutel (Key): Een type dat het protocol PreferenceKey implementeert. Bepaalt het type waarde dat wordt doorgegeven en hoe meerdere waarden worden samengevoegd (reduce methode).
    struct MySizePreferenceKey: PreferenceKey {
        static var defaultValue: CGSize = .zero // Standaardwaarde
    
        static func reduce(value: inout CGSize, nextValue: () -> CGSize) {
            // Logica voor het samenvoegen van waarden.
            // In dit geval kan de maximale grootte worden gekozen of worden opgeteld.
            // Voorbeeld: value = max(value, nextValue())
            // Voorbeeld voor optellen: value.width += nextValue().width; value.height += nextValue().height
             value = nextValue() // Neem gewoon de laatste waarde (als voorbeeld)
        }
    }
    
  2. Waarde instellen: De kindweergave stelt de waarde in met behulp van de modifier .preference(key:value:).
    Text("Hallo")
        .background(GeometryReader { geometry in
            Color.clear.preference(key: MySizePreferenceKey.self, value: geometry.size)
        })
    
  3. Waarde lezen: De ouderweergave leest de verzamelde waarde met behulp van de modifier .onPreferenceChange.
    VStack {
        // Kindweergaven die voorkeuren instellen
        Text("Voorbeeld 1")
            .background(GeometryReader { geometry in
                Color.clear.preference(key: MySizePreferenceKey.self, value: geometry.size)
            })
    
        Text("Voorbeeld 2 lang")
            .background(GeometryReader { geometry in
                Color.clear.preference(key: MySizePreferenceKey.self, value: geometry.size)
            })
    }
    .onPreferenceChange(MySizePreferenceKey.self) { size in
        // Hier kan de geaggregeerde grootte worden gebruikt
        print("Geaggregeerde grootte:", size)
    }
    

Wanneer gebruiken:

  • Het verkrijgen van de afmetingen van kindelementen voor een adaptieve lay-out van de ouder.
  • Het doorgeven van informatie over de positie van elementen.
  • Het maken van aangepaste ankers.
  • Het verzamelen van toestand of eigenschappen uit meerdere kindweergaven.

Verschil met Environment:

  • Environment geeft gegevens naar beneden door in de hiërarchie van weergaven.
  • PreferenceKey geeft gegevens naar boven door en maakt het verzamelen/ samenvoegen van waarden uit meerdere kindweergaven mogelijk.