发布值时 SwiftUI ObservableObject 不更新
SwiftUI ObservableObject not updating when value is Published
我有一个视图和一个 viewModel,它们应该在将用户添加到用户数组时更新 ListView。我可以验证是否正在添加用户,但 ObservedObject 没有更新。
我有一个搜索栏,可让您搜索用户,然后更新 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。
我有一个视图和一个 viewModel,它们应该在将用户添加到用户数组时更新 ListView。我可以验证是否正在添加用户,但 ObservedObject 没有更新。
我有一个搜索栏,可让您搜索用户,然后更新 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。