【Swift】delegateを使って別のViewControllerからメソッドを実行する

最近になって、ようやく delegate の使い方を理解し始めてきたので、わかるところまでをまとめ。
今回は、protocol を使って他の ViewConroller にあるメソッドを実行する方法についてです。

参考にさせていただいた記事はこちら。

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

 

サンプルコードは下記の通りです。
まずはメインページの MainViewController のコードから。

import UIKit

class MainViewController: UIViewController, SampleDelegate {
    var result: String = "結果"

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    func showModalBtnClicked(sender: UIButton){
        // モーダルで別ビューを表示する
        let subVC:SubViewController = SubViewController()
        subVC.delegate = self
        present(subVC, animated: true, completion: nil)
    }

    func changeResult(result: String) {
        print(result)
        // result を受け取った後の処理を記述
    }
}

こちらの ViewControllerSampleDelegate を継承し、SampleDelegate で定義されている changeResult メソッドの処理の内容を定義しています。
また、指定したボタンが押されたタイミングで、SubViewController をモーダルとして表示する処理を実行するよう指定しています。

次に SampleDelegate の定義と、MainViewController のメソッドを呼び出す側のサンプルコードです。

import UIKit

protocol SampleDelegate: class  {
    func changeResult(result: String)
}

class SubViewController: UIViewController {
    weak var delegate: SampleDelegate?

    override func viewDidLoad() {
        super.viewDidLoad()
        ....
        // デリゲートを使って、MainViewController の result の値を変更する
        delegate?.changeResult(result: "変更後の結果")
    }
}

SubViewController では、指定したタイミングで delegate で指定した changeResult メソッドを実行しています。
こちらを実行すると、MainViewControllerchangeResult が実行されます。

処理としては以上です!
参考にしたサンプルコードでは、前の View の背景色を変更するという処理を行なっていましたが、モーダルに入力欄を追加して、それを変更したら前の ViewController のラベルも変更される、みたいな処理もできそうですね。

 

以上、Swift の delegate を使って別の ViewController からメソッドを実行する方法についてでした。
ご参考になれば幸いです。

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

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

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

CTR IMG