@State
一个给给定类型的持久化值,通过这个值view可以读取并监控这个数值。
通过使用 @State 修饰器我们可以关联出 View 的状态. SwiftUI 将会把使用过 @State 修饰器的属性存储到一个特殊的内存区域,并且这个区域和 View struct 是隔离的. 当 @State 装饰过的属性发生了变化,SwiftUI 会根据新的属性值重新创建视图
struct ArticleDetail: View {
@State var success:Bool = false
@State var size = 100.0
}
@StateObject
- 针对引用类型设计,当View更新时,实例不会被销毁,与State类似,使得View本身拥有数据
- @StateObject 和 @ObservedObject 的区别就是实例是否被创建其的View所持有,其生命周期是否完全可控。
- StateObject行为类似ObservedObject对象,区别是StateObject由SwiftUI负责针对一个指定的View,创建和管理一个实例对象,不管多少次View更新,都能够使用本地对象数据而不丢失
@StateObject private var articleVM = ArticleViewModel()
@Published
@Published是SwiftUI最有用的包装之一,允许我们创建出能够被自动观察的对象属性,SwiftUI会自动监视这个属性,一旦发生了改变,会自动修改与该属性绑定的界面。
class ArticleViewModel: ObservableObject {
@Published var message = ""
}
@StateObject private var articleVM = ArticleViewModel()
articleVM.message
@EnvironmentObject
使用@EnvironmentObject
在视图之间共享数据
@EnvironmentObject
。这使我们可以在任何需要的地方共享模型数据,同时还可以确保我们在数据更改时自动保持视图更新。
将其@EnvironmentObject
视为@ObservedObject
在许多视图上使用的更智能,更简单的方法。而不是在视图A中创建一些数据,然后将其传递到视图B
,然后再视图C
,然后再使用视图D
,然后再最终使用它,您可以在视图中创建并将其放入环境中,以便视图B
,C
和D
将自动访问它。
注意:环境对象必须由祖先视图提供-如果SwiftUI
找不到正确类型的环境对象,则会崩溃。这也适用于预览,因此请小心。
@Binding
@Binding的作用是在保存状态的属性和更改数据的视图之间创建双向连接,将当前属性连接到存储在别处的单一数据源(single source of truth),而不是直接存储数据。将存储在别处的值语意的属性转换为引用语义,在使用时需要在变量名加$符号。
通常使用场景是把当前View中的@State值类型传递给其子View,如果直接传递@State值类型,将会把值类型复制一份copy,那么如果子View中对值类型的某个属性进行修改,父View不会得到变化,所以需要把@State转成@Binding传递。
@Binding 修饰属性无需有初始化值,Binding可以配合@State或ObservableObject对象中的值属性一起使用,注意不是@ObservedObject属性包装器
下面转载一个博客的一段话:
@State和@ObservableObject之间有一些细微的差异。这些都是很重要的,因为它们都有不同的用途。首先,@State在视图本地。值或数据在视图中本地保存。它由框架管理,由于它存储在本地,因此它是一个值类型。但是@ObservableObject在视图外部,并且不存储在视图中。它是一种引用类型,因为它不在本地存储,而只是具有对该值的引用。这不是由框架自动管理的,而是开发人员的责任。这最适用于外部数据,例如数据库或由代码管理的模型。
@Binding也在视图内,但是与@State区别在于@Binding用于不通视图之间的参数传递。@Binding 和@ObservedObbjecg一样都是传递引用。
@EnvironmentObject 可以理解为全局变量