[Swift3]2つ前の画面に戻る方法

2017.09.03
2つ前の画面に戻る記事のアイキャッチ

こんにちは、プログラマーの@Yuuです。

SwiftでUIViewControllerを使用して1つ前の画面に戻る場合
self.dismiss(animated: true, completion:nil)このように記述しますよね。

「でも2つ前の画面に戻る際にはどのように書いたらいいんだろう?」というのが今回のテーマになります。

この記事では「単純に2つ前の画面に戻る方法」と、応用編として「1つ前の画面に戻ってその画面で戻るボタンを押す」という2つの方法をご紹介します。

この記事では「navigationController」を使用せず「ViewController」を使用した場合の解説になります。

スポンサーリンク

2つ前の画面(ViewController)に戻る方法

まずはシンプルに2つ前の画面に戻る方法から。

単純に2つ前の画面に戻る方法

以下が2つ前の画面に戻るコードになります。

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つ前の画面に戻ってその画面で戻るボタンを押す」処理になります。

上記のコードはSecondViewControllerに以下のコードが書かれた想定で書いています。

コードの簡単な解説を行うと、
2,3行目でSecondViewControllerを取得後、SecondViewControllerに戻り、
6行目でSecondViewControllerの戻るボタンを押すというアクションを行っています。

コメントアウトまんまですw

ポイントというほどではないのですが、
今回のコードでは3行目のsecondVc.dismissanimatedに対してfalseを設定する事で、2つ前の画面に自然に戻る事が出来ました。
この部分は、遷移時の仕方や1つ前の画面での戻り方などに関係してくる部分なので、色々値を変えて自分の思ったとおりの表示が出来るように設定して下さい。

あとがき

今回この記事を書くにあたり1番勉強になったことは、普段から良く使っていたdismissがどのような挙動をするメソッドか分かった事でした。

何気なく使っているメソッドも調べて見ると意外と深いもんですね。

ではでは
今回はこの辺で!ヽ(•̀ω•́ )ゝ✧

2つ前の画面に戻る記事のアイキャッチ

この記事が気に入ったらいいね!
して最新情報をチェックしよう!

スポンサーリンク