ios - 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 ,一切都会完美运行。我怎么解决这个问题?
解决方案
试试这个(我只简化了你的模型以在操场上测试)
您可以直接在操场上复制代码并检查
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)
}
}
推荐阅读
- notepad++ - 如何使用正则表达式替换字符串
- angular - 如何在单元格值更改时更改后续单元格的背景颜色?
- javascript - 使用 Vue 和 Ant Design Table 显示来自 Ajax 的数据
- python - 如何提出回溯问题的时间复杂度?
- php - 如何通过cron php在API中插入数据
- java - 如何获取特定数据并将其用作从 firebase 中另一个表中获取另一个数据的键
- python-3.x - 如何解决virtualenv中的“没有名为'cPickle'的模块”异常
- python - Python Plotting API:如何通过烧瓶 API 公开您的科学 Python 图?
- swift - 如何根据用户给出的数量使用循环显示AZ字符?
- javascript - 将 pug 编译的内容附加到 pug 模板