Apple 所说的 @ObjectBinding 应该通过视图传递是什么意思?
What does Apple mean by @ObjectBinding should be passed over through view?
最近在学习SwiftUI。
自从我看到 Data flow over SwiftUI video from Apple 解释@ObjectBinding 和@EnvironmentObject 之间的区别后,我想到了一个问题。
苹果是什么意思:
您必须在@ObjectBinding 中逐跳传递模型? (29':00")
我们是否必须在另一个视图中使用@binding 传递对象才能使用它们?
如果我们不使用 @binding 并使用另一个 @ObjectBinding 引用它会怎样?
这是否会造成不便或导致 SwiftUI 无法正常工作或视图之间不同步?
[编辑:请注意@ObjectBinding 不再存在;相反,您可以使用 @State 将实例变量标记为在更改时需要刷新视图。]
当视图声明 @State
或 @Binding
变量时,其值必须显式地从视图的 parent 传递。因此,如果您有很长的视图层次结构,并且底部使用了顶部的一些数据,则必须对该层次结构的每个级别进行编码以了解并传递数据。
在他在 29:00 的评论中,他将此与在 child 视图中使用 @EnvironmentVariable 进行对比,后者在整个层次结构中搜索该数据。这意味着任何不明确需要数据的视图都可以有效地忽略它。注册变量只需完成一次(通过视图上的 .environmentObject(_)
)。
这是一个人为的例子。给定一些符合 ObservableObject
、
的数据类型
class SampleData: ObservableObject {
@Published var contents: String
init(_ contents: String) {
self.contents = contents
}
}
考虑这个视图层次结构:
struct ContentView: View {
@State private var data = SampleData("sample content")
var body: some View {
VStack {
StateViewA(data: self.data)
EnvironmentViewA()
.environmentObject(self.data)
}
}
}
struct StateViewA: View {
@State var data: SampleData
var body: some View {
StateViewB(data: self.data)
}
}
struct StateViewB: View {
@State var data: SampleData
var body: some View {
Text(self.data.contents)
}
}
struct EnvironmentViewA: View {
var body: some View {
EnvironmentViewB()
}
}
struct EnvironmentViewB: View {
@EnvironmentObject var data: SampleData
var body: some View {
Text(self.data.contents)
}
}
ContentView
中的结果将是显示同一段文本的两个视图。在第一个中,StateViewA
必须将数据传递给它的 child(即模型是从 "hop to hop" 传递的),而在第二个中,EnvironmentViewA
不必是完全了解数据。
最近在学习SwiftUI。 自从我看到 Data flow over SwiftUI video from Apple 解释@ObjectBinding 和@EnvironmentObject 之间的区别后,我想到了一个问题。 苹果是什么意思:
您必须在@ObjectBinding 中逐跳传递模型? (29':00")
我们是否必须在另一个视图中使用@binding 传递对象才能使用它们?
如果我们不使用 @binding 并使用另一个 @ObjectBinding 引用它会怎样?
这是否会造成不便或导致 SwiftUI 无法正常工作或视图之间不同步?
[编辑:请注意@ObjectBinding 不再存在;相反,您可以使用 @State 将实例变量标记为在更改时需要刷新视图。]
当视图声明 @State
或 @Binding
变量时,其值必须显式地从视图的 parent 传递。因此,如果您有很长的视图层次结构,并且底部使用了顶部的一些数据,则必须对该层次结构的每个级别进行编码以了解并传递数据。
在他在 29:00 的评论中,他将此与在 child 视图中使用 @EnvironmentVariable 进行对比,后者在整个层次结构中搜索该数据。这意味着任何不明确需要数据的视图都可以有效地忽略它。注册变量只需完成一次(通过视图上的 .environmentObject(_)
)。
这是一个人为的例子。给定一些符合 ObservableObject
、
class SampleData: ObservableObject {
@Published var contents: String
init(_ contents: String) {
self.contents = contents
}
}
考虑这个视图层次结构:
struct ContentView: View {
@State private var data = SampleData("sample content")
var body: some View {
VStack {
StateViewA(data: self.data)
EnvironmentViewA()
.environmentObject(self.data)
}
}
}
struct StateViewA: View {
@State var data: SampleData
var body: some View {
StateViewB(data: self.data)
}
}
struct StateViewB: View {
@State var data: SampleData
var body: some View {
Text(self.data.contents)
}
}
struct EnvironmentViewA: View {
var body: some View {
EnvironmentViewB()
}
}
struct EnvironmentViewB: View {
@EnvironmentObject var data: SampleData
var body: some View {
Text(self.data.contents)
}
}
ContentView
中的结果将是显示同一段文本的两个视图。在第一个中,StateViewA
必须将数据传递给它的 child(即模型是从 "hop to hop" 传递的),而在第二个中,EnvironmentViewA
不必是完全了解数据。