3

我有一个视图和一个 viewModel,当用户添加到用户数组时应该更新 ListView。我可以验证是否正在添加用户,但 ObservedObject 没有更新。

我有一个搜索栏,可让您搜索用户,然后更新 ViewModel 中的用户数组,该数组应该更新 View 但它没有。

视图模型

class UsersViewModel: ObservableObject {
    @Published var users: [User] = []
    @Published var isLoading = false
    var searchText: String = ""
    
    func searchTextDidChange() {
        isLoading = true
        API.User.searchUser(text: searchText) { (users) in
            self.isLoading = false
            self.users = users
        }
        // confirmed that users has data now at this point
    }
}

看法

struct UsersView: View {
    @ObservedObject var usersViewModel = UsersViewModel()
    
    var body: some View {
        VStack() {
            SearchBarView(text: $usersViewModel.searchText, onSearchButtonChanged: usersViewModel.searchTextDidChange)
            
            // Not getting called after usersViewModel.users gets data
            if (usersViewModel.users.count > 0) {
                Text(usersViewModel.users[0].username)
            }
        }
    }
}
4

2 回答 2

3

您可能会使用不同的 UsersViewModel 对象:

@ObservedObject var usersViewModel = UsersViewModel()

由于 UsersView 是一个结构,因此每次实例化 View 时都会创建一个新模型(这可能经常发生,而不仅仅是在视图出现时)。在 iOS 14 中@StateObject,将 State(保留 View 实例化之间的信息)与 ObservedObject 结合起来,但在 iOS 13 中,如果 ObservedObject 不是共享实例,我建议传入它。

于 2020-08-15T16:54:58.517 回答
2

尝试更新主队列

API.User.searchUser(text: searchText) { (users) in
   DispatchQueue.main.async {
      self.isLoading = false
      self.users = users
   }
}
于 2020-08-15T15:27:39.000 回答