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