見出し画像

【IT技術】【Swift】画面間での値の引き渡し

こんにちは。ラフアンドレディ(株)iOS大好き春蔵です。

別の記事「【Swift】MVVMモデルについて」では、View-ViewModel-Model構成を説明しました。

今回は、画面間で@StateObject内の値を引き渡す方法を2パターン、サンプルをもとにご紹介したいと思います。

サンプルコードについては最後にリンクを記載しています。

サンプルの動作

以下の動作はPage3でも同様の動きとなります。

Page1にてPage2に渡す値を入力
Page2にて渡された値を確認
Page1に戻り、Page2に渡す値を変更
Page 2ににて変更された値を確認


パターン1. StateObjectを渡す

 struct Page1: View {
    @StateObject var viewModel = Page1ViewModel()
    
    var body: some View {
        NavigationView {
            VStack {
                Spacer()
                TextField("Page2へ渡す値", text: $viewModel.page2Value)
                    .textFieldStyle(RoundedBorderTextFieldStyle())
                    .padding()
                NavigationLink(destination: Page2(viewModel: Page2ViewModel(value:viewModel.page2Value))) {
                    Text("Page2へ遷移")
                }
・・・
struct Page2:View {
    @StateObject var viewModel:Page2ViewModel
    
    var body: some View {
        Text(viewModel.value)
    }
}

class Page2ViewModel : ObservableObject {
    init(value: String = "") {
        self.value = value
    }
    
    var value = ""
}

パターン1では、遷移先の画面(Page2)をインスタンス化するとともに、Page2のViewModel、Page2ViewModelもインスタンス化し、値を渡します。

パターン2. StateObject内の変数を渡す

struct Page1: View {
    @StateObject var viewModel = Page1ViewModel()
    
    var body: some View {
        NavigationView {
・・・
                TextField("Page3へ渡す値", text: $viewModel.page3Value)
                    .textFieldStyle(RoundedBorderTextFieldStyle())
                    .padding()
                NavigationLink(destination: Page3(argument:viewModel.page3Value)) {
                    Text("Page3へ遷移")
                }
                Spacer()
            }
        }

struct Page3:View {
    @StateObject var viewModel = Page3ViewModel()
    var argument = ""
    
    var body: some View {
        Text(viewModel.value)
            .onAppear {
                viewModel.onAppear(argument:argument)
            }
    }
}

class Page3ViewModel : ObservableObject {
    @Published var value = ""

    func onAppear(argument:String) {
        value = argument
    }
}

パターン2では、遷移先の画面(Page3)をインスタンス化するとともに、Page 3のパラメータ(argument)に値を渡します。
Page3では、初期表示時に呼ばれるonAppearでPage3ViewModel内に値を格納します。


コードサンプル

アプリケーション

今回紹介した画面遷移の手法を利用したiOSアプリです。

Swiftプログラミングをされる方の参考になれば幸いです。
それではまた!楽しいSwiftライフを!

───-- - - - 

フォロー Me!
↓ ↓
Twitter : @RandR_inc

◆───-- - - - 

ラフアンドレディでの採用はこちら ↓ ↓ ↓

ラフアンドレディでは、みんなのびのびと仕事をしています!エンジニアが長く幸せに活躍できる環境で、仲間と楽しく働いてみませんか?

この記事が参加している募集

リモートワークの日常

この記事が気に入ったらサポートをしてみませんか?