将State视为视图的唯一真实来源,作为一种改变变量并使视图无效以反映该状态的方法。 另一方面,Binding是a two-way connection between a view and its underlying model。一种改变不受视图管理的State的方法(例如,Toggle反映和控制一个bool值,而控件本身不知道该值的存储或来源) 最后,您可以使用$前置运算子,从任何State取得Binding。 在这两种方法中进行选择的简单指南如下: 我是否需要修改我的私有值?=〉状态 我需要修改其他视图的状态吗?=〉Binding
8条答案
按热度按时间ivqmmu1c1#
@State
和@Binding
都是属性 Package 函数。@国家
@Binding
puruo6ea2#
SwiftUI是一个声明性的面向组件的框架。你必须忘记MVC,在MVC中,你有控制器在视图和模型之间进行中介。SwiftUI使用区分算法来理解变化,并只更新相应的视图。
@州
@Binding
@环境对象
pu3pd22g3#
将
State
视为视图的唯一真实来源,作为一种改变变量并使视图无效以反映该状态的方法。另一方面,
Binding
是a two-way connection between a view and its underlying model。一种改变不受视图管理的State
的方法(例如,Toggle
反映和控制一个bool值,而控件本身不知道该值的存储或来源)最后,您可以使用
$
前置运算子,从任何State
取得Binding
。在这两种方法中进行选择的简单指南如下:
我是否需要修改我的私有值?=〉状态
我需要修改其他视图的状态吗?=〉Binding
k2fxgqgv4#
州/省
@State
关键字允许我们要求SwiftUI监控属性的值。一旦值发生变化,View
将失效,并以有效的方式再次呈现。@propertyWrapper
,概述了真理的来源。绑定
@Binding
和$
-前缀允许将State
属性传递到嵌套子级中。@Binding
又一个显式依赖于状态的@propertyWrapper
。Binding
属性 Package 器,您可以定义一个对事实源的显式依赖,而无需拥有它,此外,您不需要指定初始值,因为绑定可以从状态派生。供您参考的链接:Medium
fnvucqvd5#
关于 @State 和 @Binding
假设您有两个SwiftUI视图。在第一个视图中,您声明了一个
count
变量,在第二个视图中,您创建了一个Tap Me
按钮。当单击该按钮时,第一个视图中count
的值将被更新。要实现此逻辑,在第一个视图中需要一个@State
属性 Package 器,在第二个视图中需要一个@Binding
属性 Package 器。x1M5 N1 X允许本地操作x1M6 N1 X少量数据。x1M7 N1 X直接创建和管理值,所以它是
Source of Truth
。@Binding
也引用value type
的数据,但是由不同的视图拥有。@Binding
不是事实的来源。为了将@State
属性提供给Binding<T>
,您需要使用$
操作符(即,它看起来像$count
)。@Binding
在属性和另一个视图之间创建双向连接。下面是代码:
除了前面提到的属性 Package 器之外,还可以借助所谓的“Trinity”工具包--
@StateObject
、@Published
和@ObservedObject
--来实现类似的结果。属性 Package 函数
下面的透视表表示17个常用SwiftUI 4.0属性 Package 器的三个主要特征(事实来源、用途和语义)。
| 编号|属性 Package 函数|真理之源|这是干什么用的?|语义学|
| - -|- -|- -|- -|- -|
| 01年|@应用程序存储|是的|从用户默认值读取/写入|价值|
| 二| @Binding |不可以|创建双向连接|价值|
| 03年|@环境|不可以|从系统读取数据|价值|
| 04年|@环境对象|不可以|从多个视图中读取共享对象|参考文献|
| 05年|@获取请求|是的|将其用于CoreData提取请求|价值|
| 06年|@焦点绑定|不可以|监视键视图中的值|价值|
| 07年|@焦点值|不可以|@FocusedBinding的简单版本|价值|
| 08年|@手势状态|是的|存储活动手势的值|价值|
| 09年|@命名空间|是的|命名空间允许改进代码结构|价值|
| 10个|@观察对象|不可以|引用符合ObservableObject的外部类的示例|参考文献|
| 十一|@已发布|是的|附加到ObservableObject内的属性|价值|
| 十二个|@缩放度量|是的|读取用户的动态类型设置|价值|
| 十三个|@场景存储|是的|还原系统状态的轻量数据|价值|
| 十四| @State |是的|在本地操作视图的数据|价值|
| 十五个| @State 对象|是的|存储符合ObservableObject的新示例|参考文献|
| 十六岁|@ NS应用程序委派配接器|是的|创建AppKit应用程序委托|协议书|
| 十七岁|@ UI应用程序委派配接器|是的|创建UIKit应用程序委托|协议书|
如何...
下面的示例说明如何使用四个常用的属性 Package 。
68de4m5k6#
我想提供一个 * 非常简短 * 的“实际使用”解释,这有助于我澄清它。我不是在定义状态/绑定,我只是指出最大的区别。
@State
拥有价值,即“真理之源”@Binding
传递值,用作管道。关于**@State**,有一件重要的事情:更改将触发重绘。更改**@State**的值将导致整个视图“重新执行”。
px9o7tmv7#
这是我为自己准备的笔记,
@州:
@Binding :
谢谢你!
wribegjk8#
State字符串、整数和布尔值等简单属性属于单个视图-标记为私有
绑定类似自定义类型的复杂属性在多个视图中共享数据。引用类型必需
EnvironmentObject在其他地方创建的属性,如共享数据,如果缺少该属性,应用程序将崩溃。