【Delegate】ViewController間でデータをやり取りする方法

複数のViewControllerの間でデータをやり取りしたい時があります。

例えば以下のアプリのようにTableViewでタッチされたお店を、地図上のピンで選択する時です。

このように異なるViewの間でデータをやり取りするにはSwiftのdelegateを使うと実装できます。

ピンを選択する機能はMapViewでないとできません。

しかし、Delegateを使うとピンを選択する機能をTableViewに与えることができます。

そうすれば、TableViewで選択された情報をもとにピンを選択することができます。

MapViewのコントローラをMapVC

TableViewのコントローラをSemiModalVCとして説明していきます。

プロトコル

まずはプロトコルを作成します。

MapVCの中に以下を記載します。

プロトコルで定める関数はピンを選択する機能です。

プロトコルに批准する

上記のプロトコルをMapVCで批准し、ピンを選択する処理を実装します。

delegate変数を追加する

SemiModalVCの中にdelegate変数を追加します。

ViewController同志をdelegateで結びつける

SemiModalVCとMapVCを結びつけます。

SemiModalVCをインスタンス化して、プロパティであるdelegateにMapVC自身を設定します。

テーブルが選択された時にピンを選択する

選択されたテーブルの行番号を使ってピン(annotation)を選択する関数を実行しています。

こんな感じでVC間のやり取りはDelegateを使うと便利です。