ナトーアプリ工房

iOS開発やApple製品の情報発信ブログです

【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も更新される】