[Swift3]2つ前の画面に戻る方法
こんにちは、プログラマーの@Yuuです。
SwiftでUIViewControllerを使用して1つ前の画面に戻る場合
self.dismiss(animated: true, completion:nil)
このように記述しますよね。
「でも2つ前の画面に戻る際にはどのように書いたらいいんだろう?」というのが今回のテーマになります。
この記事では「単純に2つ前の画面に戻る方法」と、応用編として「1つ前の画面に戻ってその画面で戻るボタンを押す」という2つの方法をご紹介します。
スポンサーリンク
2つ前の画面(ViewController)に戻る方法
まずはシンプルに2つ前の画面に戻る方法から。
単純に2つ前の画面に戻る方法
以下が2つ前の画面に戻るコードになります。
1 |
self.presentingViewController?.presentingViewController?.dismiss(animated: true, completion: nil) |
presentingViewController
というプロパティには、モーダル表示された遷移前の画面が格納されています。
そのため、このようにpresentingViewController
を2回書いた場合は、2つ前のViewControllerを指定した事になります。
そしてdismiss
というメソッドはてっきり「前の画面に戻るだけ」のメソッドだと思っていたのですが、ViewControllerを破棄するためのメソッドなんですね。
dismiss
のApple Developer公式ドキュメントをgoogle翻訳すると以下のように書かれてました。
いくつかのView Controllerを連続して提示して、提示されたView Controllerのスタックを構築する場合、スタック内のView Controllerでこのメソッドを呼び出すと、直下の子View Controllerとその子の上のすべてのView Controllerがスタック上になくなります。
dismiss(animated:completion:) - UIViewController | Apple Developer Documentationより引用
つまり複数前のViewControllerでdismiss
を呼び出すと、それ以降に遷移したViewControllerを破棄してくれると、なるほど便利。
仮に以下の画像のように、
FirstViewController -> SecondViewController -> ThirdViewControllerと遷移した場合
ThirdViewController上で
self.presentingViewController?.presentingViewController?
を実行すると「FirstViewController」が取得出来る、
そして、その取得したFirstViewControllerでdismiss
を実行すると、先ほどのgoogle翻訳に書かれているとおり
直下の子View Controllerとその子の上のすべてのView Controllerがスタック上になくなります
となるため、直下の子・その子の上のすべてのViewControllerにあたる「SecondViewController」と「ThirdViewController」は破棄され、2つ前の画面「FirstViewController」に戻る、という流れになります。
1つ前の画面に戻ってその画面で戻るボタンを押す
先ほどのコードを少し応用したやり方です。
上記の画像でいうと「ThirdViewController」から一気に「FirstViewController」に戻りたいけど、
「SecondViewController」に(想定上)配置されている「戻るボタン」を押して「FirstViewController」に戻りたい。
という処理になります。
一気に戻りたいけどSecondViewControllerで何か処理を行ってからFirstViewControllerまで戻りたい、というような場合にはこの方法が使えます。
ではお待たせしました。
以下が「1つ前の画面に戻ってその画面で戻るボタンを押す」処理になります。
1 2 3 4 5 6 |
// SecondViewControllerを取得し戻る guard let secondVc = self.presentingViewController as? SecondViewController else {return} secondVc.dismiss(animated: false, completion: nil) // SecondViewControllerの戻るボタンを押す secondVc.pushBackBtn(UIButton()) |
上記のコードはSecondViewControllerに以下のコードが書かれた想定で書いています。
1 2 3 4 |
@IBAction func pushBackBtn(_ sender: UIButton) { print("push back button") self.dismiss(animated: true, completion: nil) } |
コードの簡単な解説を行うと、
2,3行目でSecondViewControllerを取得後、SecondViewControllerに戻り、
6行目でSecondViewControllerの戻るボタンを押すというアクションを行っています。
コメントアウトまんまですw
ポイントというほどではないのですが、
今回のコードでは3行目のsecondVc.dismiss
でanimated
に対してfalse
を設定する事で、2つ前の画面に自然に戻る事が出来ました。
この部分は、遷移時の仕方や1つ前の画面での戻り方などに関係してくる部分なので、色々値を変えて自分の思ったとおりの表示が出来るように設定して下さい。
あとがき
今回この記事を書くにあたり1番勉強になったことは、普段から良く使っていたdismiss
がどのような挙動をするメソッドか分かった事でした。
何気なく使っているメソッドも調べて見ると意外と深いもんですね。
ではでは
今回はこの辺で!ヽ(•̀ω•́ )ゝ✧