首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ObservedObject未触发视图重绘

ObservedObject未触发视图重绘
EN

Stack Overflow用户
提问于 2020-10-01 22:10:32
回答 2查看 65关注 0票数 0

我有一个视图,需要从api获取数据。我对SwiftUI的理解是,通过使用onAppear,api将被调用,视图模型属性将被更新,StateObject将被更改,这将触发视图重绘。

问题是没有重绘发生。

我可以看到发生了api调用,在使用解码的数据后添加debug,我可以看到返回了大量数据。

我删除了很多代码,以使逻辑更容易理解(如下所示)。

用@ObservedObject替换@StateObject和从父级传入视图也没有区别。

谢谢

代码语言:javascript
复制
struct FactoryDetailView: View {

  var factory: Factory
  @StateObject var factoryDetailsViewModel: FactoryDetailsViewModel()

  var body: some View {

     VStack {
        Text(factory.name)
        ForEach(factoryDetailsViewModel.details) { det in
          Text(det)
        }
     }
     .onAppear { factoryDetailsViewModel.loadDetails(factory) }
  }
}

视图模型:

代码语言:javascript
复制
class FactoryDetailsViewModel: ApiViewModel {
  @Published var details: [ String ]
  func loadDetails(factory: Factory) {

     // Do api call...

     self.objectWillChange.send()
     self.details = decodedResultsFromApiCall
     self.objectWillChange.send()
}
代码语言:javascript
复制
class ApiViewModel: ObservableObject {
}
EN

回答 2

Stack Overflow用户

发布于 2020-10-01 22:20:41

好吧..。删除的细节可能是问题的原因,但通常的方法应该如下所示

代码语言:javascript
复制
struct FactoryDetailView: View {
  ...
  // assume it is a type and here there is initialization 
  @StateObject var factoryDetailsViewModel = FactoryDetailsViewModel()
  ...

现在关于self.objectWillChange.send() -不要调用它,修改已发布的属性它会被自动调用

代码语言:javascript
复制
func loadDetails(factory: Factory) {

     // Do api call...
     { 
          // this is inside (!) API callback
          DispatchQueue.main.async {
             // update published property on main queue, always.
             self.details = decodedResultsFromApiCall
          }
     }
}
票数 0
EN

Stack Overflow用户

发布于 2020-10-01 22:58:26

这就是答案:

@Published property wrapper not working on subclass of ObservableObject

我看到的问题也是一样的--将ObservableObject子类化。

我现在已经有了一个解决方案,在父类中使用“@Published var api_response”,并从子类的属性中删除@Published(尽管在子类中保留“@Published”似乎不会造成任何副作用,所以如果只是为了记录意图,它们也可以保留下来)。

感谢您的回复。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64157178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档