了解SwiftUI中的@Binding

Wiz*_*ard 7 swift swiftui

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

@State var myText: String

var body: some View {
  VStack {
    TextField($myText, placeholder: Text("input"))
    Text(myText)
  }
}
Run Code Online (Sandbox Code Playgroud)

这会将myTest与我添加的文本字段的内容绑定在一起(即,一项更改将跟进另一项更新)

但是,尽管我知道$ myText指的是Binding的绑定类型,但我注意到Binding也是属性委托,并且我注意到它出现在Apple的一些代码示例中。我不知道这是什么用作属性委托。@State已经可以进行绑定了,那么我们需要@Binding做什么呢?苹果文档对此很烂。

Mat*_*ini 8

根据本WWDC演讲(通过Swift UI的数据流):

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

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

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

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

它们内部可能存在许多状态,可以指示SwiftUI如何显示它们-但是否应由超级视图决定是否显示,因此需要提供@BindingisShowing)。


Cja*_*jay 8

@State只是另一个@propertyWrapper,概述了真理来源

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

@Binding还有另一个明确依赖状态的@propertyWrapper。

“ ...通过使用Binding属性包装器,您可以定义对真相源的显式依赖关系,而无需拥有它,此外,由于绑定可以从状态派生,因此不需要指定初始值。” - WWDC19会话226(13:01)

在此处输入图片说明 - WWDC19会话226


Jim*_*lai 5

Binding<T>是 的财产代表@Binding

$myText 为您提供一个Binding<String>.

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

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

正如您所看到的,绑定不需要具有实际存储的属性,它委托给具有存储的其他实例,在本例中是@State. 由此得名。


ata*_*asa 5

  • 如果您需要属于单个视图的简单属性,则应使用@State
  • 如果您需要拥有可能属于多个视图(如 2-3 个视图)的复杂属性,则应使用@ObjectBinding
  • 最后,如果您需要拥有需要使用所有视图的属性,则应使用@EnvironmentObject。


pac*_*ion 3

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

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

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

(在你的情况下 和String之间TextField

因此,binding来回绑定值的状态以及@State用于读取和改变值的状态,以及binding它所存储的值的状态。