我观看了一些有关数据绑定的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做什么呢?苹果文档对此很烂。
根据本WWDC演讲(通过Swift UI的数据流):
https://developer.apple.com/wwdc19/226
@State应该用于内的本地/私有更改View。理想情况下,它们将是私有的。
@Binding当值outside位于当前视图域中时,应在子视图/可重用组件中使用。
您可以在presentation(:_)API中看到它。
它们内部可能存在许多状态,可以指示SwiftUI如何显示它们-但是否应由超级视图决定是否显示,因此需要提供@Binding(isShowing)。
@State只是另一个@propertyWrapper,概述了真理的来源。
“ ...使用状态时,框架为变量分配持久性存储并将其作为依赖项进行跟踪……您始终必须指定初始常量值” -WWDC19 Session 226(07:41)
@Binding还有另一个明确依赖状态的@propertyWrapper。
“ ...通过使用Binding属性包装器,您可以定义对真相源的显式依赖关系,而无需拥有它,此外,由于绑定可以从状态派生,因此不需要指定初始值。” - WWDC19会话226(13:01)
Binding<T>是 的财产代表@Binding。
$myText 为您提供一个Binding<String>.
@State正如您所描述的,“绑定工作”的方式是为您提供一个Binding<String>使用 getter/setter 进行初始化的方法,该 getter/setter 捕获State<T>.
现在,TextField通过调用传入绑定的 setter 来改变 myText 的值,该绑定又调用State<T>实际设置 myText 的 setter。
正如您所看到的,绑定不需要具有实际存储的属性,它委托给具有存储的其他实例,在本例中是@State. 由此得名。
| 归档时间: |
|
| 查看次数: |
7483 次 |
| 最近记录: |