【SwiftUI】@EnvironmentObject
@EnvironmentObject
@EnvironmentObjectは@ObservedObjectをそれぞれのViewで共通のプロパティを使えるようにしたものです。
①インスタンスの基となるクラスは『ObservableObject』プロトコルを付けます
②Viewを更新したいプロパティには@Publishedを付けます
③インスタンスを作成する際は@EnvironmentObjectを記述します
※型を指定しているだけなので、クラス名の後には『()』は付けません
【複数のViewに更新されない例】
mport SwiftUI
struct ContentView: View {
@ObservedObject var フルーツ = クラス(果物:"🍎", 数:1)
var body: some View {
VStack {
Button(action: 関数1, label: {
Text("果物を変える")
})
Button(action: 関数2, label: {
Text("個数を変える")
})
Text("ContentView \(フルーツ.果物)を\(フルーツ.数)個買いました")
ContentView2()
}
}
func 関数1() {
switch フルーツ.果物{
case "🍎":
フルーツ.果物 = "🍌"
default:
フルーツ.果物 = "🍎"
}
}
func 関数2() {
フルーツ.数 = フルーツ.数 + 1
}
}
class クラス: ObservableObject {
@Published var 果物 :String
@Published var 数 :Int
init(果物:String, 数:Int) {
self.果物 = 果物
self.数 = 数
}
}
struct ContentView2: View {
@ObservedObject var フルーツ = クラス(果物:"🍎", 数:1)
var body: some View {
Text("ContentView2 \(フルーツ.果物)を\(フルーツ.数)個買いました")
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
【ボタンをクリックしてもContentView2は更新されない】
【複数のViewに更新する例】
import SwiftUI
struct ContentView: View {
@EnvironmentObject var フルーツ:クラス
var body: some View {
VStack {
Button(action: 関数1, label: {
Text("果物を変える")
})
Button(action: 関数2, label: {
Text("個数を変える")
})
Text("ContentView \(フルーツ.果物)を\(フルーツ.数)個買いました")
ContentView2()
}
}
func 関数1() {
switch フルーツ.果物{
case "🍎":
フルーツ.果物 = "🍌"
default:
フルーツ.果物 = "🍎"
}
}
func 関数2() {
フルーツ.数 = フルーツ.数 + 1
}
}
class クラス: ObservableObject {
@Published var 果物 = "🍎"
@Published var 数 = 1
}
struct ContentView2: View {
@EnvironmentObject var フルーツ:クラス
var body: some View {
Text("ContentView2 \(フルーツ.果物)を\(フルーツ.数)個買いました")
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
.environmentObject(クラス())
}
}
【ボタンをクリックするとContentView2も更新される】