ビュー間での値の受渡し
ここではビューを2つ用意して、片方のビューからもう一方のビューへの値の渡し方を説明します。
Xcode でのボタンやラベルなどのオブジェクトの設置方法、アウトレットの作成方法及びセグウェイの作成方法は既知のものとしています。
もし不安な方は「アウトレット」や「ストーリーボードで画面遷移を決める ~ セグウェイ」 などを見ておくと良いと思います。
また、ビューコントローラの追加方法とそのクラスのビューとの関連付け方法について図解します。
それではさっそく、簡単なサンプルコードを書きながらみていきましょう。
ここで作成するプログラムの動作
ここで作成するのは、次のようなプログラムです。
テキストフィールドとボタンのある画面があり、ここに例えば「こんにちは」とかいて、"Go to View2" というラベルのボタンを押します。
すると、次の画面が現れて、ラベルに「こんにちは」と表記されている、というプログラムです。
ポイントは、最初の画面で入力した任意の文字(ここでは「こんにちは」)が、次の画面で使われているというところです。
値を受け渡すプログラムの作成
Xcode で新規のプロジェクトとして作成しましょう。ここではテンプレートは "Single View Application" を選択します。
Product Name はここでは "MultiView2" としました。
プロジェクトを作成したらさっそくストーリーボードを開きます。
ストーリーボードに、オブジェクトライブラリーから ViewController をドラッグアンドドロップし、 その上で、下記のスクリーンショットのように、テキストフィールド、ボタン、ラベルを配置します。
ボタンを押下したときのセグウェイを作成します。
ここまでの具体的な手順で不安があるひとは、「ストーリーボードで画面遷移を決める ~ セグウェイ」を 参考にしてください。
さて、一つ目のビューコントローラにはテキストフィールドのアウトレットを作成します。
これはアシスタントエディターに、テキストフィールドを Ctrl+ドラッグアンドドロップすると作成できるのでしたね。
次に上記で追加したビューコントローラのコードを実装します。プロジェクトのフォルダで右クリックして、New File... を選択します。
Cocoa Touch Class を作成します。
UIViewController クラスのサブクラスとして作成します。名前は ViewController2 としておきましょう。
ちなみにビューコントローラークラスは、それに関連付けられたビューのレイアウト、リサイズ、及びビュー内の内容の調整を司るのが主な役割です。
そこで、今回手動で追加したビューに新しく作成したビューコントローラクラスを関連付けましょう。
ビューを選択して、ビューコントローラボタンをクリック。そしてアイデンティティ・インスペクタを表示します。
カスタムクラスとして、先ほど追加した ViewController2 を指定します。
ここに、ラベルのアウトレットと、文字列を保持するための String 型の変数を作成しておきます。
さて、これで準備はできました。
いよいよ今回のキモの部分です。ビューからビューへの値の受け渡しです。
これをするために、値を渡す側、今回の場合 ViewController クラスで prepareForSegue メソッドをオーバーライドします。
このメソッドの引数として取得できる segue の destinationViewController プロパティで、画面遷移先のビューコントローラの インスタンスを取得できます。
今回は遷移先のビューコントローラクラスは上記で作成した ViewController2 であることが分かっていますので、 それへキャストしています。
as! で強制的なキャストを行っています。Swift のタイプキャストに付いては「タイプキャスト」をみてください。
以上で二個目のビューのビューコントローラへ値をセットできました。そこで viewDidLoad 内でその値をラベルにセットすれば、 ラベルに表示できます。
以上でプログラムは完成です。それでは動作確認をみてみましょう。
シミュレータを起動して、テキストフィールドに文字を入力。そしてボタン "Go to View2" をクリックします。
すると次のように、2個目のビューのラベルに入力した文字が表示されるはずです。
以上で、2個のビュー間で値を渡す方法を説明しました。