最近になって、ようやく 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 からメソッドを実行する方法についてでした。
ご参考になれば幸いです。