SwiftUI 属性包装器

2022-06-26  本文已影响0人  雨泽Sunshine

1.@State

SwiftUI管理声明为@State的属性,当值变化时,SwiftUI会更新依赖于该值的视图结构。使用@State来表明这个属性是值的唯一真实来源。

如果将状态属性传递给子视图,SwiftUI会在父级中的值更改时更新子级,但子级无法修改该值。

2.@ Binding

@Binding将属性连接到存储在其他地方的真实来源,建立一个双向连接,而不是直接存储数据。可以读取和写入真实来源所拥有的值。

因为在Swift中值的传递形式是值类型传递,也就是传递的是一个拷贝过的值,但是通过@Binding修饰后,属性变成了一个引用类型,这样父子视图的状态就关联起来了。

@Binding修饰的属性无需有初始化值,初始化时会将状态属性的值传递给绑定属性。

3.@EnvironmentObject

由父视图或祖先视图提供可观察对象,在视图之间共享数据,同时确保在数据更改时自动保持视图更新。

使用@EnvironmentObject对象前确保在祖先视图上使用了environmentObject(_:)设置了相应的模型对象,这对预览模式也适用。

@EnvironmentObject修饰的属性无需有初始化值,初始化时会从祖先视图获取值。

4.@Published

创建能够被自动观察的对象属性,SwiftUI会自动监听该属性,一旦发生了改变,会自动修改与该属性绑定的视图。

5.@StateObject

用于初始化一个遵循ObservableObject协议的对象,当该可观察对象的已发布属(@Published修饰)发生更改时,SwiftUI会更新依赖于这些属性的视图部分。@StateObject属性是被创建它的View所持有的,其生命周期和它的View的生命周期是一样的:

final class ModelData: ObservableObject {
    @Published var title = "Hello word"
}

@StateObject var model = ModelData()

// title有任何改变都会更新该视图
Text(model.title)

可以将状态对象传递给其他视图。也可以通过environmentObject(_:)将状态对象添加到视图结构中的环境中:

ContentView().environmentObject(model)

如果创建上述代码所示的环境对象,可以在子视图使用@ EnvironmentObject读取内部对象:

@EnvironmentObject var model: DataModel
上一篇下一篇

猜你喜欢

热点阅读