微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

值发布后,SwiftUI ObservableObject不更新

如何解决值发布后,SwiftUI ObservableObject不更新

我有一个视图和一个viewmodel,当将用户添加用户数组时,它们应该更新ListView。我可以确认正在添加用户,但是Observedobject没有更新。

我有一个搜索栏,可让您搜索用户,然后在viewmodel中更新用户数组,这应该会更新View,但不会。

viewmodel

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)
            }
        }
    }
}

解决方法

尝试在主队列上更新

API.User.searchUser(text: searchText) { (users) in
   DispatchQueue.main.async {
      self.isLoading = false
      self.users = users
   }
}
,

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

@ObservedObject var usersViewModel = UsersViewModel()

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。