Ich habe eine SwiftUI-Ansicht, die ein aufgerufenes EnvironmentObject aufnimmt appModel
. Es liest dann den Wert appModel.submodel.count
in seiner body
Methode. Ich erwarte , dass dies meine Ansicht nach auf die Eigenschaft binden , count
auf , submodel
so dass es wieder macht , wenn die Eigenschaft Updates, aber dies nicht zu geschehen scheint.
Ist das ein Fehler? Und wenn nicht, wie können Ansichten idiomatisch an verschachtelte Eigenschaften von Umgebungsobjekten in SwiftUI gebunden werden?
Insbesondere sieht mein Modell so aus ...
class Submodel: ObservableObject {
@Published var count = 0
}
class AppModel: ObservableObject {
@Published var submodel: Submodel = Submodel()
}
Und meine Ansicht sieht so aus ...
struct ContentView: View {
@EnvironmentObject var appModel: AppModel
var body: some View {
Text("Count: \(appModel.submodel.count)")
.onTapGesture {
self.appModel.submodel.count += 1
}
}
}
Wenn ich die App starte und auf das Etikett count
klicke, erhöht sich die Eigenschaft, aber das Etikett wird nicht aktualisiert.
Ich kann dies beheben, indem ich appModel.submodel
als Eigentum an übergeben werde ContentView
, aber ich möchte dies nach Möglichkeit vermeiden.
Antworten:
Verschachtelte Modelle funktionieren in SwiftUI noch nicht, aber Sie könnten so etwas tun
Grundsätzlich
AppModel
fängt man das Ereignis abSubmodel
und sendet es weiter an die AnsichtBearbeiten:
Wenn Sie nicht
SubModel
klasse sein müssen, können Sie auch Folgendes ausprobieren:quelle
Submodel
seinObservableObject
Typ?Alle drei ViewModels können kommunizieren und aktualisieren
Vielen Dank, dass Sie Sorin für Combine Lösung.
quelle
Es sieht aus wie ein Käfer. Wenn ich den xcode auf die neueste Version aktualisiere, funktioniert er beim Binden an verschachtelte ObservableObjects ordnungsgemäß
quelle