SwiftUI中常用的状态关键字有@State、@Binding、@ObservedObject和@EnvironmentObject
- @State:用于描述视图内部的状态,当状态发生改变时,视图会自动刷新。@State的值只在当前视图中有效,不能被其他视图使用。示例:
struct ContentView: View {
@State var count = 0
var body: some View {
VStack {
Text("Count: \(count)")
Button(action: {
self.count += 1
}) {
Text("Increment")
}
}
}
}
- @Binding:用于将外部状态绑定到视图内部的状态,当外部状态发生改变时,视图会自动刷新。@Binding的值可以被其他视图使用。示例:
struct ContentView: View {
@State var count = 0
var body: some View {
VStack {
Text("Count: \(count)")
ChildView(count: $count)
}
}
}
struct ChildView: View {
@Binding var count: Int
var body: some View {
Button(action: {
self.count += 1
}) {
Text("Increment")
}
}
}
- @ObservedObject:用于将外部对象的状态绑定到视图内部的状态,当外部对象的状态发生改变时,视图会自动刷新。@ObservedObject的值只在当前视图中有效,不能被其他视图使用。示例:
class Counter: ObservableObject {
@Published var count = 0
}
struct ContentView: View {
@ObservedObject var counter = Counter()
var body: some View {
VStack {
Text("Count: \(counter.count)")
Button(action: {
self.counter.count += 1
}) {
Text("Increment")
}
}
}
}
- @EnvironmentObject:用于将全局对象的状态绑定到视图内部的状态,当全局对象的状态发生改变时,视图会自动刷新。@EnvironmentObject的值可以被其他视图使用。示例:
class Counter: ObservableObject {
@Published var count = 0
}
struct ContentView: View {
@EnvironmentObject var counter: Counter
var body: some View {
VStack {
Text("Count: \(counter.count)")
Button(action: {
self.counter.count += 1
}) {
Text("Increment")
}
ChildView()
}
}
}
struct ChildView: View {
@EnvironmentObject var counter: Counter
var body: some View {
Text("Count: \(counter.count)")
}
}
智能应用: ChatYou