1. 概念
所有应用程序都会更改状态。
例如:
- 用户点击了一个按钮来显示更多信息
- 用户在文本框中输入了一些文本
- 用户从日期选择器中选择了一个日期
所有涉及应用程序 从一种状态转变到另一种状态 的事情,都叫做应用程序更改状态。
2. 问题所在
状态的问题在于它是混乱的: 当它发生变化时,我们需要发现变化并更新我们的布局来匹配变化。 这个一开始听起来可能很简单,但是随着我们的状态不断增长,它就会变得越来越难 - 因为这个时候,我们很容易忘记更新一件事,或者更新顺序出错,以致于用户界面状态达不到预期效果。
3. SwiftUI 如何破解?
SwiftUI 通过 从控件中移除状态 来解决这个问题。
当我们向视图添加属性时,这些属性实际上是惰性的 - 当然,它们有值,但是更改这些值不会有任何作用。 但是如果我们在这些属性之前添加了特殊的@State
来包装属性,SwiftUI 将自动监视属性变化并更新使用该状态的视图的任何部分。
示例代码:
@state var name: String = ""
注意:
@state
这种语法称为 属性包装器,这里不作详细介绍,可以自行查找文档。
当涉及到某种状态时 - 例如,当切换开关(toggle switch)改变时告诉状态属性改变。
这里需要注意的是: 我们不能直接引用这个属性。这是因为 Swift 会认为我们现在所指的是"属性当前的值"
,而不是说 "请注意这件事情(属性状态变化)"
。幸运的是,SwiftUI 的解决方案是在属性名称前放置一个美元符号($)
,这样的话,我们就可以引用属性本身而不是它当前的值。
当然,这里一开始理解起有点令人困惑,但在当我们学习一两个示例之后就会理解,非常简单。
最后,请记住,SwiftUI 是声明性的,这意味着我们预先将所有可能状态的所有布局都告诉了它,并让它知道当属性发生变化时如何在它们之间移动。我们称之为 绑定(binding) - 要求 SwiftUI 同步 UI 控件和基础属性之间的更改。 如果你已经习惯了一种更强制性的编程风格,那么使用 state 一开始会让你感到头疼,但是请相信我 - 一旦你了解了它,一切都会一帆风顺。