【发布时间】:2020-05-02 09:10:24
【问题描述】:
我有一个内容视图,我在其中使用 ForEach 显示项目列表
@ObservedObject var homeVM : HomeViewModel
var body: some View {
ScrollView (.horizontal, showsIndicators: false) {
HStack(spacing: 10) {
Spacer().frame(width:8)
ForEach(homeVM.favoriteStores , id: \._id){ item in
StoreRowOneView(storeVM: item)
}
Spacer().frame(width:8)
}
}.frame(height: 100)
}
而我的ObservableObject 包含
@Published var favoriteStores = [StoreViewModel]()
而StoreViewModel定义如下
class StoreViewModel : ObservableObject {
@Published var store:ItemStore
init(store:ItemStore) {
self.store = store
}
var _id:String {
return store._id!
}
}
如果我直接填充数组,它工作正常,我可以看到商店列表 但是如果我在网络调用(后台作业)后填充了数组,则视图不会收到有更改的通知
StoreApi().getFavedStores(userId: userId) { (response) in
guard response != nil else {
self.errorMsg = "Something wrong"
self.error = true
return
}
self.favoriteStores = (response)!.map(StoreViewModel.init)
print("counnt favorite \(self.favoriteStores.count)")
}
但奇怪的是: - 如果我添加一个显示数组项计数的文本,视图将得到通知并且一切正常
这就是我的意思:
@ObservedObject var homeVM : HomeViewModel
var body: some View {
ScrollView (.horizontal, showsIndicators: false) {
HStack(spacing: 10) {
Spacer().frame(width:8)
ForEach(homeVM.favoriteStores , id: \._id){ item in
StoreRowOneView(storeVM: item)
}
Text("\(self.homeVM.favoriteStores.count)").frame(width: 100, height: 100)
Spacer().frame(width:8)
}
}.frame(height: 100)
}
对此有何解释?
【问题讨论】:
-
我面临着完全相同的问题。虽然没有运气。我已经坚持了好几天了。 ViewModel 在网络调用后更新,但列表在此之后停止更新。当我在网络调用后打印对象时,它给了我预期的值,但视图没有更新。
-
@Ishmeet 如果您找到解决此问题的方法,请告诉我
-
我还没有找到解决方案。我认为这是一个 SwiftUI 错误。
-
@Ishmeet - 你们现在找到解决方案了吗?我有同样的问题,但我使用的是列表视图。我的列表始终有 2 个单元格,并且单元格正确加载了静态信息,当我点击 Web 服务并更新模型时,视图不再重新调整。当我打印模型对象时,它们会使用最新数据进行更新。如果你们找到任何解决方案,请更新帖子
-
@Dinakar 我们确实找到了解决方案,通过重构使用正确的 State/ObservableObject/Binding 组合。我们确保我们的对象作为 State 归父级所有。但是,在向下游传递对象时,我们使用了 Binding 和 ObservedObject 属性包装器。来自 WWDC 的这段视频帮助我们实现了结果:developer.apple.com/videos/play/wwdc2019/226。如果您可以分享您的代码,我可能会提供更好的帮助。
标签: swift xcode mvvm observable swiftui