首页 > 解决方案 > 苹果应该通过视图传递@ObjectBinding 是什么意思?

问题描述

我一直在学习 SwiftUI。自从我看到Apple 的 SwiftUI 视频中的数据流解释了 @ObjectBinding 和 @EnvironmentObject 之间的区别后,我想到了一个问题。苹果是什么意思:

您必须在 @ObjectBinding 中从一跳到另一跳传递模型吗?(29':00")

我们是否必须在另一个视图中使用 @binding 传递对象才能使用它们?

如果我们不使用 @binding 并使用另一个 @ObjectBinding 引用它怎么办?

这是否会造成不便或使 SwiftUI 无法正常工作或视图彼此不同步?

标签: iosswiftswiftuiswift5.1swiftui-environment

解决方案


[编辑:请注意 @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根本不需要知道数据。


推荐阅读