【SwiftUI】@ObservedObject
@ObservedObject
インスタンスでViewを更新したい場合は@Stateでは無く@ObservedObjectを使います
@ObservedObjectが付いたインスタンスのプロパティが変更された時にViewを更新します
①インスタンスの元となるクラスには ObservableObject プロトコルを付けます
②インスタンスを作成する際に@ObservedObjectを付けます
③Viewを更新したいプロパティには@Publishedを付けます
【Viewが更新されない例】
import SwiftUI
struct ContentView: View {
var フルーツ = クラス(果物:"🍎", 数:1)
var body: some View {
VStack {
Button(action: 関数1, label: {
Text("果物を変える")
})
Button(action: 関数2, label: {
Text("個数を変える")
})
Text("\(フルーツ.果物)を\(フルーツ.数)個買いました")
}
}
func 関数1() {
switch フルーツ.果物{
case "🍎":
フルーツ.果物 = "🍌"
default:
フルーツ.果物 = "🍎"
}
}
func 関数2() {
フルーツ.数 = フルーツ.数 + 1
}
}
class クラス {
var 果物 :String
var 数 :Int
init(果物:String, 数:Int) {
self.果物 = 果物
self.数 = 数
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
ボタンをクリックしてもViewが更新されません
【Viewを更新させる例】
import SwiftUI
struct ContentView: View {
@ObservedObject var フルーツ = クラス(果物:"🍎", 数:1)
var body: some View {
VStack {
Button(action: 関数1, label: {
Text("果物を変える")
})
Button(action: 関数2, label: {
Text("個数を変える")
})
Text("\(フルーツ.果物)を\(フルーツ.数)個買いました")
}
}
func 関数1() {
switch フルーツ.果物{
case "🍎":
フルーツ.果物 = "🍌"
default:
フルーツ.果物 = "🍎"
}
}
func 関数2() {
フルーツ.数 = フルーツ.数 + 1
}
}
class クラス: ObservableObject {
@Published var 果物 :String
@Published var 数 :Int
init(果物:String, 数:Int) {
self.果物 = 果物
self.数 = 数
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
ボタンをクリックするとviewが更新されます