SwiftUI 常用 Property Wrappers 之 ObservedObject
🧠🔋
从字面的意思上我们可以了解,这个 Property Wrapper 是使 SwiftUl View 观察一个外部的 Object,当Object 变化的时候 Swiftul 得到通知可以更新 View 等。
仍然是双向绑定的思想,其实还是 reactive 等框架的思想。
ObservableObject Protocol
想创建一个可以 ObservedObject 的 Object 需要是一个 class 类,且遵守 ObservableObject Protocol
class Employee: ObservableObject {
var age: Int = 24
}
@Published
当一个 ObservedObject 的变量更新的时候,如果想自动更新 View 需要里面的变量有 @Published 关键字。
class Employee: ObservableObject {
@Published var age: Int = 24
}
当age 变化的时候,包含 ObservedObject 的 View 会更新内容。
class Employee: ObservableObject {
@Published var age: Int = 24
}
struct ObservedObjectView: View {
@ObservedObject var employee = Employee()
var body: some View {
VStack {
Text("Age: \(employee.age)")
Button {
employee.age += 1
} label: {
Text("增加年龄")
}
}
}
}
objectwillChange
在很多时候,当我们没有 ObservedObject 或者不是 @Published 的时候,我们想更新 View 可以使用objectwillChange。
class Employee: ObservableObject {
var age: Int = 24
}
struct ObservedObjectView: View {
@ObservedObject var employee = Employee()
var body: some View {
VStack {
Text("Age: \(employee.age)")
Button {
employee.objectWillChange.send()
employee.age += 1
} label: {
Text("增加年龄")
}
}
}
}
注意❤️ Binding 可以是 Optional 的值,但是 ObservedObject 不可以。