StateObject與ObservedObject的差別在於,如果同一頁有ObservedObject與State變數共同存在時,ObservedObject的變數會被State變數所影響,來看看以下的例子:
新增一個ObservableObject的class,裡面有一個Published變數:
class MyObject: ObservableObject {
@Published var count = 0
}
宣告MyObject物件為ObservedObject狀態的變數:
struct SwiftUIView13_SubView: View {
@ObservedObject var myObject = MyObject()
var body: some View {
VStack{
Text("\(myObject.count)")
Button(action: {
myObject.count = myObject.count + 1
}, label: {
Text("Button")
})
}
}
}
在頁面上引用這個SwiftUIView13_SubView:
struct SwiftUIView13: View {
var body: some View {
VStack{
SwiftUIView13_SubView()
}
}
}
新增一個變數為State狀態,並且加入按鈕可以累加這個變數:
struct SwiftUIView13: View {
@State var count = 0
var body: some View {
VStack{
SwiftUIView13_SubView()
Text("\(count)")
Button(action: {count = count + 1} ) {
Text("update")
}
}
}
}
顯示如圖:
此時如果去按下上面的按鈕,確實會將MyObject內的變數count進行加1,但如果去按下下面的按鈕時,除了會把count變數加1之外,也會把MyObject內的變數count進行清除,表示當我們在更新SwiftUIView13的時候, 原本在SwiftUIView13_SubView中的myObject物件又被重新生成了一次,所以就會被歸零。
顯示如圖:
要解決這個問題則必須要將ObservedObject使用StateObject來取代:
struct SwiftUIView13_SubView: View {
@StateObject var myObject = MyObject()
var body: some View {
VStack{
Text("\(myObject.count)")
Button(action: {
myObject.count = myObject.count + 1
}, label: {
Text("Button")
})
}
}
}
所以現在兩個按鈕的累加數值,就會各自獨立互相不影響了。
從 SwiftUI 到 Apple Vision Pro - SwiftUI 從零開始 Day13 [完]