美文网首页
SwiftUI 属性包装器

SwiftUI 属性包装器

作者: 雨泽Sunshine | 来源:发表于2022-06-26 17:40 被阅读0次

    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
    

    相关文章

      网友评论

          本文标题:SwiftUI 属性包装器

          本文链接:https://www.haomeiwen.com/subject/ouxbvrtx.html