ios - 苹果应该通过视图传递@ObjectBinding 是什么意思?
问题描述
我一直在学习 SwiftUI。自从我看到Apple 的 SwiftUI 视频中的数据流解释了 @ObjectBinding 和 @EnvironmentObject 之间的区别后,我想到了一个问题。苹果是什么意思:
您必须在 @ObjectBinding 中从一跳到另一跳传递模型吗?(29':00")
我们是否必须在另一个视图中使用 @binding 传递对象才能使用它们?
如果我们不使用 @binding 并使用另一个 @ObjectBinding 引用它怎么办?
这是否会造成不便或使 SwiftUI 无法正常工作或视图彼此不同步?
解决方案
[编辑:请注意 @ObjectBinding 不再存在;相反,您可以使用 @State 将实例变量标记为在更改时需要刷新视图。]
当视图声明一个@State
或@Binding
变量时,它的值必须显式地从视图的父级传递。因此,如果您有一个较长的视图层次结构,其中一些来自顶部的数据在底部使用,您必须对该层次结构的每个级别进行编码以了解并传递数据。
在 29:00 的评论中,他将此与在子视图中使用 @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
必须将数据传递给它的孩子(即模型从“跳到跳”传递),而在第二个中,EnvironmentViewA
根本不需要知道数据。
推荐阅读
- python - Unstack Groupby 没有使用 Pandas 将数据分组到正确的数据集中
- python - LCD 未使用新值更新
- python - 适用于 Windows 10 的 PyBluez?
- python - 如何修复函数对象不可迭代?
- python - 布尔值不可调用
- javascript - 使用 axios 将 Fileupload 和 JsonData 对象发送到 dotnet core api 时出错
- image - 停止 TinyMCE 图像工具插件将图像文件重命名为 imagetools.jpg
- php - Laravel:在另一个数据透视表中使用一个数据透视表 id
- google-bigquery - BigQuery - 无法解析输入字符串
- java - 在 Mac 上使用 Eclipse 时,GUI 未与 JavaFX 15 一起显示