【问题标题】:Understanding @Binding in SwiftUI理解 SwiftUI 中的 @Binding
【发布时间】:2019-10-22 15:25:46
【问题描述】:

我看了一些关于数据绑定的 WWDC 视频和 Apple 文档,根据我目前的理解,@State 作为属性委托会提供视图和注解属性之间的绑定连接,例如:

@State var myText: String

var body: some View {
  VStack {
    TextField($myText, placeholder: Text("input"))
    Text(myText)
  }
}

这会将 myText 与我添加的文本字段的内容绑定(即一个更改另一个将跟进更新)

但是,虽然我知道 $myText 指的是 Binding 的绑定类型,但我注意到 Binding 也是一个属性委托,并且我注意到它出现在 Apple 的一些代码示例中。我不知道这是用作属性委托的。 @State 已经完成了绑定工作,那么我们需要 @Binding 做什么呢? Apple 文档现在对此感到很糟糕。

【问题讨论】:

标签: swift swiftui


【解决方案1】:
  • 如果您需要一个属于单个视图的简单属性,您可以 应该使用 @State
  • 如果您需要复杂的属性,可能 属于多个视图(如 2-3 个视图),您应使用 @ObjectBinding
  • 最后,如果您需要拥有需要在各处使用的属性 您应该使用 @EnvironmentObject. 的视图

【讨论】:

    【解决方案2】:

    Binding<T>@Binding 的属性委托。

    $myText 给你一个Binding<String>

    @State 正如您所描述的那样“进行绑定工作”的方式是为您提供一个Binding<String>,该Binding<String> 使用捕获State<T> 实例引用的getter/setter 进行初始化。

    现在TextField 通过调用传入绑定的setter 来改变myText 的值,而后者又调用State<T> 的setter 来实际设置myText。

    如您所见,绑定不需要具有实际存储的属性,它委托给其他具有存储的实例,在本例中为@State。因此得名。

    【讨论】:

      【解决方案3】:

      @State 只是另一个概述事实来源的@propertyWrapper。

      “...当您使用状态时,框架会为变量分配持久存储并将其作为依赖项进行跟踪...您总是必须指定一个初始常量值”-WWDC19 Session 226(07:41)

      @Binding 另一个显式依赖于状态的 @propertyWrapper。

      "...通过使用 Binding 属性包装器,您可以定义对事实源的显式依赖而不拥有它,此外,您不需要指定初始值,因为绑定可以从状态派生。" - WWDC19 Session 226 (13:01)

      - WWDC19 Session 226

      【讨论】:

        【解决方案4】:

        根据这个 WWDC 谈话(通过 Swift UI 的数据流):

        https://developer.apple.com/wwdc19/226

        @State 应该用于View 内的本地/私有更改。理想情况下,它们应该是私有的。

        当值位于outside 当前视图域时,应在子视图/可重用组件中使用@Binding

        您可以在presentation(:_) API 中看到它。

        其中可能有一堆状态,告诉 SwiftUI 如何显示它们 - 但它是否应该出现的决定取决于超级视图,因此你需要 @Binding (isShowing)提供。

        【讨论】:

          【解决方案5】:

          @State 已经完成了绑定工作,那么我们需要 @Binding 做什么

          @State 不会自己创建绑定。它有一个public var binding: Binding<Value> 属性(docs):

          使用绑定在视图及其底层模型之间创建双向连接。

          (在您的情况下,介于 StringTextField 之间)

          因此,binding 状态用于来回绑定值,@State 用于读取和改变值并且它在其存储的值上提供binding。 p>

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-12-11
            • 1970-01-01
            • 2019-11-03
            • 1970-01-01
            • 2019-11-29
            • 1970-01-01
            • 1970-01-01
            • 2020-12-19
            相关资源
            最近更新 更多