SwiftUI:属性装饰器的理解@State,@Binding,@ObservedObject,@Published,@Environment,@EnvironmentObject
Posted wuwuFQ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SwiftUI:属性装饰器的理解@State,@Binding,@ObservedObject,@Published,@Environment,@EnvironmentObject相关的知识,希望对你有一定的参考价值。
@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
以上是关于SwiftUI:属性装饰器的理解@State,@Binding,@ObservedObject,@Published,@Environment,@EnvironmentObject的主要内容,如果未能解决你的问题,请参考以下文章
在 SwiftUI 中使用 @State 属性包装器未更新视图