遷移元画面へ戻る方法について解説します。
モーダル型の通常の画面遷移と、Navigation Controller管理下での階層型画面遷移では、戻り方が違いますので注意して下さい。
環境
この記事の情報は次のバージョンで動作確認しています。
【Xcode】Version 10.0
【iOS】12.0
通常の画面遷移(モーダル型)の場合
present()メソッド、あるいはSegueのPresent Modallyで画面遷移してきた場合がこれに該当します。遷移元画面の上に現在の画面が上書きされているイメージです。
ViewControllerクラスの戻りたい場所で次のコードを記述します。
1 2 3 |
self.dismiss(animated: true, completion: nil) |
dismiss()はViewController自身を破棄するメソッドです。
遷移元の上に上書きしていた遷移先画面が破棄された結果、元の画面に戻ります。
Navigation Controller管理下の場合
pushViewController()メソッド、あるいはSegueのShowで画面遷移してきた場合がこれに該当します。
Navigation Controller管理下では標準でbackボタンがついていますので、1つ前の画面に戻るだけなら実装は不要です。
任意のタイミングで戻りたい、あるいは戻る画面を指定したい場合は、コードによる実装が必要となります。
1つ前の画面に戻る(popViewController)
1つ前の画面に戻るには、ViewControllerクラスの戻りたい場所で次のコードを記述します。
1 2 3 |
self.navigationController?.popViewController(animated: true) |
Navigation Controllerで制御されている画面遷移ツリーの中で、1つ前の階層に戻るイメージです。
階層のトップに戻る(popToRootViewController)
Navigation Controllerによって管理される画面ツリーのトップ画面(rootView)に戻るには、ViewControllerクラスの戻りたい場所で次のコードを記述します。
1 2 3 |
self.navigationController?.popToRootViewController(animated: true) |
トップ画面(rootView)とはstoryboard上でNavigation Controller部品と直接つながっている画面を指します。
任意の階層に戻る(popToViewController)
Navigation Controllerの画面ツリー情報はUINavigationController.viewControllersに配列として管理されています。
これを利用して、次のようなコードで、任意の階層に戻る事が可能です。
1 2 3 4 5 6 7 8 |
// 2階層前の画面に戻るサンプル // layere_number:階層番号を表す。0がトップ画面(rootView) let layere_number = navigationController!.viewControllers.count self.navigationController?.popToViewController(navigationController!.viewControllers[layere_number-3], animated: true) |
なお、移動できるのは戻る場合だけで、現在の画面より先へは移動できないので注意して下さい。
まとめ
- 通常画面遷移か、Navigation Controller配下かによって戻り方が違う。
- 通常画面遷移のの場合は、dismiss()メソッド。
- Navigation Controller配下では、popViewController()メソッド。
- Navigation Controller配下では任意の階層に戻る事が可能。