最近になって、ようやく 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 を受け取った後の処理を記述
    }
}
こちらの ViewController で SampleDelegate を継承し、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 メソッドを実行しています。
こちらを実行すると、MainViewController の changeResult が実行されます。
処理としては以上です!
参考にしたサンプルコードでは、前の View の背景色を変更するという処理を行なっていましたが、モーダルに入力欄を追加して、それを変更したら前の ViewController のラベルも変更される、みたいな処理もできそうですね。
以上、Swift の delegate を使って別の ViewController からメソッドを実行する方法についてでした。
ご参考になれば幸いです。
 
					         
               
                       
												 
                