Mam widok SwiftUI, który pobiera obiekt EnvironmentObject o nazwie appModel
. Następnie odczytuje wartość appModel.submodel.count
w body
metodzie. Spodziewam się to wiązać mój pogląd na własność count
na submodel
tak, że ponownie renderuje kiedy aktualizacje własności, ale to nie wydaje się zdarzyć.
Czy to błąd? A jeśli nie, jaki jest idiomatyczny sposób powiązania widoków z zagnieżdżonymi właściwościami obiektów środowiska w SwiftUI?
W szczególności mój model wygląda tak ...
class Submodel: ObservableObject {
@Published var count = 0
}
class AppModel: ObservableObject {
@Published var submodel: Submodel = Submodel()
}
A mój widok wygląda tak ...
struct ContentView: View {
@EnvironmentObject var appModel: AppModel
var body: some View {
Text("Count: \(appModel.submodel.count)")
.onTapGesture {
self.appModel.submodel.count += 1
}
}
}
Gdy uruchamiam aplikację i klikam etykietę, count
właściwość rośnie, ale etykieta się nie aktualizuje.
Mogę to naprawić, przekazując appModel.submodel
jako właściwość ContentView
, ale chciałbym tego uniknąć, jeśli to możliwe.
Odpowiedzi:
Zagnieżdżone modele nie działają jeszcze w SwiftUI, ale możesz zrobić coś takiego
Zasadniczo twoje
AppModel
zdarzenie łapie wydarzenieSubmodel
i przesyła je dalej do WidokuEdytować:
Jeśli nie musisz
SubModel
być klasą, możesz spróbować czegoś takiego:źródło
Submodel
byćObservableObject
typ?Wszystkie trzy ViewModels mogą się komunikować i aktualizować
Dziękuję Sorin za rozwiązanie Combine.
źródło
Wygląda jak robak. Kiedy aktualizuję xcode do najnowszej wersji, działa on poprawnie po powiązaniu z zagnieżdżonymi obiektami ObservableObjects
źródło