前回に引き続き、今回も Swift についてです。
今回は、子の ViewController
から親の ViewController
のメソッドを実行する方法についてです。
モーダルのボタンをタップしたタイミングで親に定義されているメソッドを呼び出したくて実装しました。
実装の際に参考にさせていただいた記事はこちらから。
delegateで別のViewからメソッドを呼び出す – すいすいSwift
https://swiswiswift.com/2017-07-08/
最初は presentingViewController
や parent
を使って親の ViewController
を取得しようとしたのですが、なぜか親ではなくそのさらに上の ViewController が呼び出されてしまうという現象が発生しました。
表現が合っているかはわかりませんが…親ではなく、祖父母が呼び出されている状態です。
上記の方法はダメっぽいので、参考サイトを元に delegate
を使う方法に切り替えました。
まず、子の ViewController
に下記を追加します。
protocol SampleDelegate: class { func openProfile() }
なお、指定する場所は class の外で、delegate
名は変更してもOKです。
また、delegate
に指定するメソッドは、親の ViewController
から呼び出したい関数名を指定します。
私の場合は、親 ViewController
の openProfile()
という変数名を呼び出したかったので上記のように設定しています。
次に、子の 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 から呼び出す方法でした。
ご参考になれば幸いです。