@ObservedObject
属性包装器?SwiftUI 为我们提供了 @ObservedObject
属性包装器,以便视图可以监视外部对象的状态,并在重要内容发生变化时得到通知。 它的行为与 @StateObject
相似,不同之处在于它不得用于创建对象–仅将 @ObservableObject
与在其他位置创建的对象一起使用,否则 SwiftUI 可能会意外破坏该对象。
例如,我们可能会使用以下内容:
class Order: ObservableObject {
@Published var items = [String]()
}
struct ContentView: View {
@ObservedObject var order: Order
var body: some View {
// your code here
}
}
该 Order
类使用 @Published
,因此它将在项目更改时自动发送更改公告,而 ContentView
使用 @ObservedObject
来监视那些公告。如果没有 @ObservedObject
,则更改通知将被发送但被忽略。
尽管这看起来很简单,但值得深入探讨一些细节。
首先,用 @ObservedObject
标记的任何类型都必须符合 ObservableObject
协议,这反过来意味着它必须是类而不是结构。这不是可选的 – SwiftUI
要求我们在此处使用一个类。
其次,观察到的对象是专门为视图外部的数据设计的,这意味着它们可能在多个视图之间共享。 @ObservedObject
属性包装器将自动确保密切监视该属性,以便重要的更改将重新使用该视图加载任何视图。这也意味着必须在其他位置创建数据,然后将其发送到您的视图中。
第三,并不是观察对象中的所有属性都会导致视图刷新-您需要使用@Published或自定义公告来决定哪些属性应发送更改通知。为符合 ObservableObject
的类型提供默认的 objectWillChange
发布者,以便根据需要进行自定义声明。