【Swift】子のViewControllerから親のViewControllerのメソッドを実行する

前回に引き続き、今回も Swift についてです。
今回は、子の ViewController から親の ViewController のメソッドを実行する方法についてです。
モーダルのボタンをタップしたタイミングで親に定義されているメソッドを呼び出したくて実装しました。

実装の際に参考にさせていただいた記事はこちらから。

delegateで別のViewからメソッドを呼び出す – すいすいSwift
https://swiswiswift.com/2017-07-08/

 

最初は presentingViewControllerparent を使って親の ViewController を取得しようとしたのですが、なぜか親ではなくそのさらに上の ViewController が呼び出されてしまうという現象が発生しました。
表現が合っているかはわかりませんが…親ではなく、祖父母が呼び出されている状態です。

上記の方法はダメっぽいので、参考サイトを元に delegate を使う方法に切り替えました。
まず、子の ViewController に下記を追加します。

protocol SampleDelegate: class  {
    func openProfile()
}

なお、指定する場所は class の外で、delegate 名は変更してもOKです。
また、delegate に指定するメソッドは、親の ViewController から呼び出したい関数名を指定します。
私の場合は、親 ViewControlleropenProfile() という変数名を呼び出したかったので上記のように設定しています。

次に、子の ViewController 内に delegate を定義します。

weak var delegate: SampleDelegate?

そして、親の ViewController のメソッドを呼び出したいタイミングで下記を実行するようコードを修正します。

delegate?.openProfile()

ここまで追加できたら、今度は親の ViewController を開きます。
まず、class を宣言している箇所に、先ほど追加した SampleDelegate を追加します。

class ParentViewController: UIViewController, SampleDelegate  {
  ......
}

次に、子の ViewController を呼び出す or 遷移する前に、delegate を渡します。

let childVC:ChildViewController = ChildViewController()
childVC.delegate = self
self.present(childVC, animated: true, completion: nil)

上記のコードだと、2行目の処理です。

追加・修正する箇所は以上です!
実際にアプリを実行したところ、問題なく指定した通りの動作をしました!

 

以上、Swift で親の ViewController のメソッドを子の ViewController から呼び出す方法でした。
ご参考になれば幸いです。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG