J'essaie de créer un wrapper de propriété personnalisé pris en charge par SwiftUI, ce qui signifie que les modifications apportées aux valeurs de propriétés correspondantes entraîneraient une mise à jour de la vue SwiftUI. Voici une version simplifiée de ce que j'ai:
@propertyWrapper
public struct Foo: DynamicProperty {
@ObservedObject var observed: SomeObservedObject
public var wrappedValue: [SomeValue] {
return observed.value
}
}
Je vois que même si mon ObservedObject
est contenu à l'intérieur de mon wrapper de propriété personnalisée, SwiftUI intercepte toujours les modifications SomeObservedObject
tant que:
- Mon wrapper de propriété est une structure
- Mon wrapper de propriété est conforme à
DynamicProperty
Malheureusement, les documents sont rares et j'ai du mal à dire si cela ne fonctionne que par chance avec la mise en œuvre actuelle de SwiftUI.
Les documents de DynamicProperty
(dans Xcode, pas en ligne) semblent indiquer qu'une telle propriété est une propriété qui est modifiée de l'extérieur, ce qui entraîne la redessine de la vue, mais il n'y a aucune garantie de ce qui se passe lorsque vous conformez vos propres types à ce protocole.
Puis-je m'attendre à ce que cela continue de fonctionner dans les futures versions de SwiftUI?
la source
Réponses:
Ok ... voici une approche alternative pour obtenir
DynamicProperty
quelque chose de similaire ... mais en tant que struct uniquement enroulé@State
(pour forcer le rafraîchissement de la vue).Il s'agit d'un simple wrapper mais donne la possibilité d'incapsuler tous les calculs personnalisés avec l'actualisation de la vue suivante ... et comme indiqué en utilisant des types de valeur uniquement.
Voici la démo (testée avec Xcode 11.2 / iOS 13.2):
Voici le code:
la source