SwiftUI @State与绑定

时间:2019-12-09 10:45:31

标签: ios swiftui

我正在学习使用Swift和SwiftUI进行iOS编程。我了解得很少,我对@StateBinding<*>之间的区别感到困惑。

如果我正确理解,Binding从技术上来说只是State,但不会更新视图。如果是这种情况,那么如果我仅可以使用Binding做同样的事情,那为什么我需要State

7 个答案:

答案 0 :(得分:4)

SwiftUI是一个声明式的面向组件的框架。您必须忘了MVC,在MVC中,控制器在视图和模型之间进行中介。 SwiftUI使用差异算法来了解更改并仅更新相应的视图。

@状态

  • 状态属性已连接到视图。视图将永久读取State属性。这意味着每次@State属性被更改/更新时,视图都会重新呈现,并最终根据@State的数据显示内容。
  • 状态仅可用于特定视图。
  • 简单的属性(例如字符串,整数和布尔值)属于单个视图-标记为私有。
  • 所有标记为“状态”的字段都存储在特殊的单独存储器中,只有对应的视图才能访问和更新它们。

@Binding

  • BindableObject协议,该协议需要didChange属性。它可以在环境中使用它并在更改后立即重建视图。
  • didChange属性应为发布者,它是新的Apple Reactive框架(称为Combine)的一部分。
  • 发布者的主要目标是在发生任何更改时通知所有订阅者。一旦出现新值,SwiftUI就会重建视图。

@EnvironmentObject

  • 它是名为Environment的功能的一部分。您可以用所有必需的服务类填充您的环境,然后从该环境内的任何视图访问它们。
  • @EnvironmentObject可用于环境中的每个视图。
  • @EnvironmentObject在其他位置创建的属性,例如共享数据。如果缺少应用程序,则该应用程序将崩溃。
  • 环境是使用SwiftUI进行依赖项注入的正确方法。

答案 1 :(得分:3)

状态和绑定都是属性包装器。

@state

  • 这是一种属性包装器。
  • 在状态下,每次用于更改变量值。
  • 我们也可以说这是两种方式的绑定。
  • 如果要更改属性状态,则swiftUI会自动重新加载视图主体。
  • 它将用于简单的属性,例如字符串,整数和布尔值。

@Binding

  • 使用,您可以访问state属性到另一个视图。
  • 它将为您提供对该变量的读写访问权限。

答案 2 :(得分:2)

State视为视图的唯一事实来源,这是使变量变异并使视图无效以反映该状态的一种手段。

另一方面,

Bindinga two-way connection between a view and its underlying model。 更改不受视图管理的State的一种方法(例如,反映并控制布尔值的Toggle,而控件本身不知道该布尔值是关于存储或起源的)

最后,您可以使用Binding前缀运算符从任何State中获得$

在它们之间进行选择的简单指南是:

  

我需要修改一个对我来说私有的值吗? =>状态

     

我是否需要修改其他视图的状态? =>绑定

答案 3 :(得分:2)

诸如字符串,整数和布尔值之类的简单属性属于单个视图-标记为私有

绑定 复杂的属性,例如自定义类型在许多视图中共享数据。引用类型必填

EnvironmentObject 如果缺少共享属性,则在其他位置创建的属性(例如共享数据应用程序)将崩溃。

答案 4 :(得分:2)

我想提供一个非常简短的“实际用途”解释,这有助于我理清思路。 我不是在定义状态/绑定,我只是指出了很大的不同。

@State 具有价值,“真相之源”

@Binding 传递值,用作管道。

关于 @State 的一件重要事情:更改将触发重绘。更改 @State 的值将导致整个视图“重新执行”。

答案 5 :(得分:1)

•   @State keyword allows us to ask the SwiftUI to monitor the value of the property. Once the value will change, the View will be invalidated and rendered again in efficient manner.
•   A persistent value of a given type, through which a view reads and monitors the value.
•   It is just another @propertyWrapper that outlines a source of truth.
•   When you use state the framework allocate persistence storage for variable and tracks it as a dependency ... you alway has to specify an initial constant value"

绑定

•   @Binding and $ prefix allows passing State property into the nested child.
•   A manager for a value that provides a way to mutate it.
•   @Binding yet another @propertyWrapper that depends explicitly on state.
•   By using the Binding property wrapper you define an explicit dependency to a source of truth without owning it, additionally you don't need to specify an initial value because binding can be derived from state.

链接供您参考: https://medium.com/stepstone-tech/swiftui-101-how-to-use-state-and-binding-in-your-first-custom-ui-control-64d395947492

答案 6 :(得分:0)

这是我为自己准备的笔记,

@状态:

  • 我们需要在视图结构中使用它
  • 建议设为私有
  • 我们应该提供默认值
  • 可以用作绑定
  • 这旨在存储诸如 String Int Bool 等的简单类型。

@Binding:

  • 这用于在视图之间共享公共数据
  • 最好的例子是,从View 1中展示一张图纸,并从View 2中启动撤消动作
  • 不需要默认值,因为它将在另一个视图中进行设置

谢谢!