苹果应该通过视图传递@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: Viewstruct StateViewB: View 中,你的包装属性应该是@Binding var data: SampleData。也许检查并在必要时更新您的答案?

以上是关于苹果应该通过视图传递@ObjectBinding 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

结合 SwiftUI 远程获取数据 - ObjectBinding 不更新视图

合并SwiftUI远程获取数据-ObjectBinding不会更新视图

ObjectBinding 和 EnvironmentObject 有啥区别?

SwiftUI:动画更改依赖于@ObjectBinding

可以直接使用 Publisher 作为 SwiftUI 中的 @ObjectBinding 属性吗?

Xcode - 通过dismissViewControllerAnimated在2个视图之间传递数据