J'ai une vue SwiftUI qui prend un EnvironmentObject appelé appModel
. Il lit ensuite la valeur appModel.submodel.count
dans sa body
méthode. Je pense que cela lie mon avis à la propriété count
sur submodel
afin qu'il re-Renders lorsque les mises à jour de propriété, mais cela ne semble pas se produire.
Est-ce un bug? Et sinon, quelle est la manière idiomatique de faire en sorte que les vues soient liées aux propriétés imbriquées des objets d'environnement dans SwiftUI?
Plus précisément, mon modèle ressemble à ceci ...
class Submodel: ObservableObject {
@Published var count = 0
}
class AppModel: ObservableObject {
@Published var submodel: Submodel = Submodel()
}
Et ma vue ressemble à ceci ...
struct ContentView: View {
@EnvironmentObject var appModel: AppModel
var body: some View {
Text("Count: \(appModel.submodel.count)")
.onTapGesture {
self.appModel.submodel.count += 1
}
}
}
Lorsque j'exécute l'application et clique sur l'étiquette, la count
propriété augmente mais l'étiquette ne se met pas à jour.
Je peux résoudre ce problème en passant en appModel.submodel
tant que propriété ContentView
, mais j'aimerais éviter de le faire si possible.
Réponses:
Les modèles imbriqués ne fonctionnent pas encore dans SwiftUI, mais vous pouvez faire quelque chose comme ça
Fondamentalement, votre
AppModel
capture l'événementSubmodel
et l'envoyez à la vueÉditer:
Si vous n'avez pas besoin
SubModel
d'être en classe, vous pouvez essayer quelque chose comme ceci:la source
Submodel
être deObservableObject
type?Les trois ViewModels peuvent communiquer et se mettre à jour
Merci Sorin pour la solution Combine.
la source
Cela ressemble à un bug. Lorsque je mets à jour le xcode vers la dernière version, il fonctionne correctement lors de la liaison à des ObservableObjects imbriqués
la source