【Swift/iOS】画面遷移時の値渡し

画面遷移時に次の画面にデータを渡す方法を解説します。

swiftでのデータ渡しにはいくつかの手段がありますが、ここでは遷移先画面のインスタンス変数に値を設定する、ごく一般的な方法を紹介します。

スポンサーリンク

環境

この記事の情報は次のバージョンで動作確認しています。

【Xcode】10.2
【Swift】5.0
【iOS】12.2
【macOS】Mojave バージョン 10.14.4

値渡しの基本動作

画面遷移時の値渡しの基本動作は、次の通りです。

  1. 遷移先のビューコントローラーを取得。
  2. 遷移先ビューコントローラーのインスタンス変数に値をセットする。
  3. 画面遷移する。

画面遷移のパターンによって若干コードの書き方に違いはありますが、基本の流れは一緒です。

Segueを使った画面遷移での値渡し

画面1:Segueを使った画面遷移

View1のTextFieldに入力した値をView2のLabelに表示する処理を実装してみます。

View2への画面遷移にはSegueを使用します。

サンプルではActionSegueを使っていますが、ManualSegueでも値の受け渡し方法は同様です。

Segueを使った画面遷移の方法がわからない場合は、先にこちらの記事を御覧ください。

【Swift/iOS】Segueを使った画面遷移
Segueとは、storyboard上で画面遷移を表す部品です。この記事では、Segueを使った2種類の画面遷移方法を解説します。ノンコーディングでお手軽に遷移するAction Segueコード上の任意のタイミングで画面遷移させるM...

遷移元画面(View1)の実装

遷移元画面(View1)の全ソース(View1ViewController.swift)です。

コメントが振られている行が注目ポイントです。

以降で各行の解説をします。

①セグエ実行前処理

prepare()メソッドは、Segueが実行される前に呼び出されるメソッドです。

Segueを使った画面遷移では、このprepare()メソッドをオーバーライドして値を渡す処理を実装します。

②Segueの識別子確認

segue.identifierを確認して、どのSegueが実行されるのか判断します。

ここでは、id=”toView2″のSegueが実行される時に、値の設定処理を実行しています。

③遷移先ViewControllerの取得

遷移先画面のViewControllerを取得します。View2ViewControllerは遷移先画面のクラス名です。

④値の設定

遷移先画面のインスタンス変数(argString)にテキストボックスの値を設定します。

これでSegue実行前の値設定処理が完了です。

遷移先画面(View2)の実装

遷移先画面(View2)の全ソースです。(View2ViewController.swift)

コメントが振られている2行が注目ポイントです。

①引数(文字列)

前画面より値を受け取るインスタンス変数を宣言します。

インスタンス変数の型は、受け取る値によって任意に設定します。サンプルではString型の変数 argStringを定義しています。

②引数をラベルにセット

Labelのテキストに前画面より受け取った値(argString)をセットします。

これで前画面で入力した値が、ラベルテキストに表示されます。

Segueを使わない画面遷移での値渡し

画面2:Segueを使わない画面遷移

View11で入力した値をView12のLabelに表示する処理を実装します。

View12への画面遷移にはpresent()メソッドを使用します。

present()メソッドを使った画面遷移の方法がわからない場合は、先にこちらの記事を御覧ください。

【Swift/iOS】Segueを使わない画面遷移
(2019/04/07 更新)Segueを使わないで画面遷移をする方法を解説します。異なるstoryboard上にあるViewControllerに遷移するなどの場合はSegueが使えませんので、必然的にこちらの方法を使う事になります。...

遷移元画面(View11)の実装

遷移元画面(View11)の全ソースです。(View11ViewController.swift)

値渡しに関連するコードはコメントに番号が振られた1行のみです。

①値の設定

present()メソッドを呼び出す前に、遷移先画面のインスタンス変数(argString)にテキストボックスの値を設定します。

present()メッソドを使った画面遷移では、遷移先ビューコントローラーが取得処理されているのが前提となりますので、追加するのはこの1行のみです。

遷移先画面(View12)の実装

遷移先画面の実装内容については、Segueを使った画面遷移の場合と同様の為、解説を省略します。

遷移先がナビゲーションコントローラーの場合

図のように、遷移先画面の間にナビゲーションコントローラーがはさまる場合は、少し工夫が必要です。

画面3:遷移先がナビゲーションコントローラー

遷移元画面(View21)の実装

遷移元画面(View21)の全ソースです。(View21ViewController.swift)

ManualSegue(performSegue)を使った画面遷移のサンプルです。

注目ポイントは次の部分です。

直接の遷移先(=segue.destination)がNavigationControllerですので、値を設定する為には、その先にあるViewControllerを取得する必要があります。

直接Labalに値を設定できない理由

インスタンス変数に値を設定するのではなく、次のように直接ラベルテキストに値を設定すれば、インスタンス変数を用意する必要が無いため、合理的なように思えます。

しかし、これは実行時にエラーになります。

遷移先のViewControllerのインスタンスを取得した時点では、 まだラベル部品のインスタンスが存在していない為です。

最後に

画面遷移時の値渡しについて、解説しました。

サンプルでは文字列型の値を渡していますが、配列やStruct、クラス変数等を渡す事も可能です。

コメント