苹果应该通过视图传递@ObjectBinding 是啥意思?
Posted
技术标签:
【中文标题】苹果应该通过视图传递@ObjectBinding 是啥意思?【英文标题】:What does Apple mean by @ObjectBinding should be passed over through view?苹果应该通过视图传递@ObjectBinding 是什么意思? 【发布时间】:2020-02-14 14:26:05 【问题描述】:我最近在学习 SwiftUI。 自从我看到Data flow over SwiftUI video from Apple 解释@ObjectBinding 和@EnvironmentObject 之间的区别后,我想到了一个问题。 苹果是什么意思:
您必须在 @ObjectBinding 中逐跳传递模型? (29':00")
我们是否必须在另一个视图中使用@binding 传递对象才能使用它们?
如果我们不使用 @binding 并使用另一个 @ObjectBinding 引用它会怎样?
这是否会带来不便或使 SwiftUI 无法正常工作或视图彼此不同步?
【问题讨论】:
没有更多的@ObjectBinding
...这是过时的视频。你最好从官方教程开始Learn to Make Apps with SwiftUI
【参考方案1】:
[编辑:注意@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
根本不需要知道数据。
【讨论】:
感谢您的回答。我还有一个问题:你知道为什么 @ObjectBinding 已经从 SwiftUI 中删除了吗?为什么苹果没有在 WWDC 网站上提到所教授的具体材料不是最新的?什么是现在学习 SwiftUI 的好资源,也是最新的? 我不知道该决定的全部内容,但我对状态和绑定现在的工作方式感到非常满意。另外,关于为什么在 WWDC 页面上没有提到这一点的好问题;那将非常有帮助。如果您还没有,我建议您通过Apple's SwiftUI tutorials。 Hacking with Swift 也有很好的介绍。 我了解在早期版本的 SwiftUI 中,BindableObject
协议是 SwiftUI 的一部分,而不是 Combine。随着框架的变化,协议更改为ObservableObject
。
@Ben 你的回答和人为的例子真的很有帮助,比我读过或看过的任何其他的解释都更好,清楚地展示了@State
和@EnvironmentObject
之间的区别。 然而可能需要注意@State
是您的“唯一真实来源”,除非我弄错了,否则所有后续对该特定包装属性的引用都应通过@Binding
。所以在struct StateViewA: View
和struct StateViewB: View
中,你的包装属性应该是@Binding var data: SampleData
。也许检查并在必要时更新您的答案?以上是关于苹果应该通过视图传递@ObjectBinding 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
结合 SwiftUI 远程获取数据 - ObjectBinding 不更新视图
合并SwiftUI远程获取数据-ObjectBinding不会更新视图
ObjectBinding 和 EnvironmentObject 有啥区别?