SwiftUI:属性装饰器的理解@State,@Binding,@ObservedObject,@Published,@Environment,@EnvironmentObject

SwiftUI:属性装饰器的理解@State,@Binding,@ObservedObject,@Published,@Environment,@EnvironmentObject,第1张

@State

@State属性允许你修改Struct的属性,这些属性在普通的Struct里面是不允许修改的。通过使用@State修饰器我们可以关联出 View 的状态. SwiftUI 将会把使用过 @State 修饰器的属性存储到一个特殊的内存区域,并且这个区域和 View struct 是隔离的. 当 @State 装饰过的属性发生了变化,SwiftUI 会根据新的属性值重新创建视图。

建议把@State包装的属性都设置成私有

@State private var username = ""
@Binding

有时候我们会把一个视图的属性传至子节点中,但是又不能直接的传递给子节点,因为在 Swift 中值的传递形式是值类型传递方式,也就是传递给子节点的是一个拷贝过的值。但是通过 @Binding 修饰器修饰后,属性变成了一个引用类型,传递变成了引用传递,这样父子视图的状态就能关联起来了。

struct ContentView: View {
    @State private var showingAddUser = false

    var body: some View {
        VStack {
        }
    }
    .sheet(isPresented: $showingAddUser) {
        AddView(isPresented: self.$showingAddUser)
    }
}

struct AddView: View {
    @Binding var isPresented: Bool

    var body: some View {
        Button("Dismiss") {
            self.isPresented = false
        }
    }
}
@ObservedObject

@ObservedObject 的用处和 @State 非常相似,从名字看来它是来修饰一个对象的,这个对象可以给多个独立的 View 使用。如果你用 @ObservedObject 来修饰一个对象,那么那个对象必须要实现 ObservableObject 协议,也就是说必须是class对象,不能是struct。然后用 @Published 修饰对象里属性,表示这个属性是需要被 SwiftUI 监听的

class Order: ObservableObject {
    @Published var items = [String]()
}

struct ContentView: View {
    @EnvironmentObject var order: Order

    var body: some View {
    }
}
@Published

@Published 允许我们创建出能够被自动观察的对象属性,SwiftUI会自动监视这个属性,一旦发生了改变,会自动修改与该属性绑定的界面。首先需要遵循ObservableObject属性,所以必须是 class ,不能是Struct

class Order: ObservableObject {
    @Published var items = [String]()
}
@EnvironmentObject

从名字上可以看出,这个修饰器是针对全局环境的。通过它,我们可以避免在初始 View 时创建 ObservableObject, 而是从环境中获取 ObservableObject

class Order: ObservableObject {
    @Published var items = [String]()
}

struct ContentView: View {
    @EnvironmentObject var order: Order

    var body: some View {
    }
}
@Environment

SwiftUI 本身就有很多系统级别的设定,我们可以通过 @Environment 来获取到它们

    @Environment(\.calendar) var calendar: Calendar
    @Environment(\.locale) var locale: Locale
    @Environment(\.colorScheme) var colorScheme: ColorScheme
	@Environment(\.horizontalSizeClass) var horizontalSizeClass
	@Environment(\.managedObjectContext) var managedObjectContext

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/994723.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存