EnvironmentObjectをViewModelに渡す方法について記載します。
目次
1. 環境
Xcode : 12.2
Swift : 5
2. 構成
ContentView
ChildViewModel で設定した値を表示します。
ChildView
ContentView の 子ビュー。
ボタンを押したら、ChildViewModel の関数を呼び出します。
ChildViewModel
EnvironmentObject に値を設定します。
ここで設定した値が、ContentView に表示されます。
3. ポイント
特別なことはなく ChildViewModel で EnvironmentObject を受け取る関数を作り、ChildView から VM の関数を呼び出し設定します。
ChildViewModel
1 2 3 4 |
// EnvironmentObject を設定 public func setShareData( shareData: ShareData ){ self.shareData = shareData } |
ChildView
1 2 3 4 |
}.onAppear(){ // ViewModel に EnvironmentObject を設定 childViewModel.setShareData(shareData: shareData) } |
4. コード全体
EnvironmentObject(ShareData.swift)
1 2 3 4 5 |
import Foundation class ShareData: ObservableObject { @Published var message = "" } |
ContentView
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import SwiftUI struct ContentView: View { @EnvironmentObject var shareData: ShareData var body: some View { ChildView() .environmentObject(shareData) Text(shareData.message) // ViewModel で設定した値を表示 } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() .environmentObject(ShareData()) } } |
ChildView
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
import SwiftUI struct ChildView: View { @EnvironmentObject var shareData: ShareData @ObservedObject var childViewModel: ChildViewModel init(){ childViewModel = ChildViewModel() } var body: some View { VStack { Button(action: { // ViewModel の関数を呼び出す childViewModel.setMessage(message: "VMでメッセージを設定") }, label: { Text("メッセージを表示") .frame(minWidth: 0, maxWidth: .infinity) .padding(20) .overlay(RoundedRectangle(cornerRadius: 25.0).stroke(Color.blue, lineWidth: 3)) }) .background(RoundedRectangle(cornerRadius: 25.0).fill(Color.white)) .padding(20) }.onAppear(){ // ViewModel に EnvironmentObject を設定 childViewModel.setShareData(shareData: shareData) } } } struct ChildView_Previews: PreviewProvider { static var previews: some View { ChildView() } } |
ChildViewModel
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import SwiftUI import Combine class ChildViewModel: ObservableObject, Identifiable { @Published var shareData: ShareData? // EnvironmentObject を設定 public func setShareData( shareData: ShareData ){ self.shareData = shareData } // EnvironmentObject に値を設定 public func setMessage( message: String ){ self.shareData?.message = message } } |