4.1 使用状态(state)管理视图更新

所有的应用都会改变状态(这里可以把状态理解成内存中的值),比如用户点击了一个按钮来显示更多内容,在文本框输入一些文本,从日期选择器选择一个日期,涉及到应用程序的都可以理解成从一个状态转移到另一个状态,不断延续。

这会导致一个问题,那就是状态管理的混乱,当状态发生变化时,我们需要去监听变化,然后更新视图布局。这听起来很简单,但是随着状态不断变多,管理跟监听将变得越来越困难,比如忘了更新视图,或者更新顺序错误,达不到我们预期的要求。

SwiftUI 很大程度上解决了这个问题,把状态从控件中移除。当我们向视图添加属性时,这个属性是“惰性”的,也就是说这个值变化的时候,视图不会有任何变化。但是我们可以添加 @State 属性,这样 SwiftUI 就可以自动监听并且随着值的更新而改变视图。

关于状态引用,举个例子,当有一个开关按钮发生变化的时候需要告诉状态属性值更新了,我们不能直接把它关联到状态,这是因为 Swift 会认为我们引用的是当前的状态值,而不是说要监听这个值。但是在 SwiftUI 环境下可以解决这个问题,在属性前面加一个 $ 符号,这样就可以关联到状态属性本身,而不是它的当前值。

要记住一点,SwiftUI 是生命式的语法,这意味着我们需要预先告知在状态所有可能的情况下会导致什么样的视图显示,并让它弄清楚,状态改变了视图要如何更新。简称绑定吧。

如果之前一直使用命令式语法编程,现在使用状态来管理,一开始可能会有点不习惯。但是如果你搞明白了,将更加高效。

如果这章看不懂,很正常,请直接跳到下一章。