首页 > 解决方案 > objectWillChange 不更新视图

问题描述

我有看起来像这样的 ViewModel:

class ItemsListViewModel : ObservableObject{

     var response : ItemsListResponse? = nil    
     var itemsList : [ListItem] = []    
     var isLoading = true    
     let objectWillChange = PassthroughSubject<Void, Never>()


     func getItems() {
         self.isLoading = true

         ApiManager.shared.getItems()
        .sink(receiveCompletion: {completion in
        }, receiveValue: {               
            self.response = data   
            self.isLoading = false
            self.objectWillChange.send()                
        })    
   }
}

当我收到来自网络请求的数据时,我会self.objectWillChange.send()通知视图,但视图不会对此做出反应。

我的看法:

项目查看

struct ItemsView: View {      

    var body: some View {
        VStack{
           Text("Some Title")
           ItemsListView()
        }
    }
}

项目列表视图

struct ItemsListView: View {      
    @ObservedObject var myViewModel = ItemsListViewModel()

    var body: some View {
        VStack{
           Text("\(self.myViewModel.response?.total")
        }.onAppear{
             self.myViewModel.getItems()                   
        }
    }
}

但有趣的是,如果我不在 ItemsView内使用ItemsListView ,一切都会完美运行。我怎么解决这个问题?

标签: iosswiftswiftui

解决方案


试试这个(我只简化了你的模型以在操场上测试)

您可以直接在操场上复制代码并检查

struct Model {

    var items : [String]
}

class ItemsListViewModel : ObservableObject {

    @Published var items : [String] = ["Test 1", "Test2"]
}

let myViewModel = ItemsListViewModel()

struct ItemsView: View {

    var body: some View {
        VStack{
           Text("Some Title")
            ItemsListView().environmentObject(myViewModel)
        }
    }
}

struct ItemsListView: View {

    @EnvironmentObject private var model : ItemsListViewModel

    var body: some View {
        VStack{
            Text("\(model.items.count)")
        }
    }
}

struct ContentView: View {
    var body: some View {
        ItemsView()
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView().environmentObject(myViewModel)
    }
}

推荐阅读