【发布时间】:2019-10-23 07:19:18
【问题描述】:
我正在使用新的 SwiftUI。我有一个UserUpdate 类,它是一个Bindable Object,我想修改这些变量并自动更新用户界面。
我成功更新了这些值,但是当我更改 UserUpdate 类中的变量时,我的 UI 结构中的视图没有更新。
它仅在我修改 UI 结构本身中的 @EnviromentObject 变量时发生变化。
这是我的可绑定对象类:
final class UserUpdate: BindableObject {
let didChange = PassthroughSubject<Any, Never>()
var allUsers: [User] = [] {
didSet {
print(allUsers)
didChange.send(allUsers)
}
}
var firstName: String = "" {
didSet {
didChange.send(firstName)
}
}
var lastName: String = "" {
didSet {
didChange.send(lastName)
}
}
}
这是我的用户类:
struct User: Identifiable {
let id: Int
let firstName, lastName: String
}
以下是我配置 UI 的方式:
struct ContentView : View {
@EnvironmentObject var bindableUser: UserUpdate
var body: some View {
NavigationView {
VStack(alignment: .leading) {
Text("All Users:").bold().padding(.leading, 10)
List {
ForEach(bindableUser.allUsers) { user in
Text("\(user.firstName) \(user.lastName)")
}
}
}
}
}
}
这里我修改UserUpdate中的变量:
class TestBind {
static let instance = TestBind()
let userUpdate = UserUpdate()
func bind() {
let user = User(id: userUpdate.allUsers.count, firstName: "Heyy", lastName: "worked")
userUpdate.allUsers.append(user)
}
}
【问题讨论】:
-
那是因为你的视图变量(bindableUser) 绑定到EnvirnomentObject 流。视图不会知道您是否更新了其他流。
-
我该如何解决呢?我不明白为什么 Bindable Object 有用。
-
您是否已将环境绑定到场景委托中的视图?见stackoverflow.com/questions/56476007/…
-
@Paulw11 我已经这样做了
-
BindableObject协议现在重命名为ObservableObject,ObjectBinding现在是ObservedObject,didChange现在是objectWillChange。