遷移元が複数ある時の画面遷移
はじめに
遷移元が複数あって、その遷移元に戻るという実装に詰まったのでメモをしていく。
- HogeViewController -> PiyoViewControllerのとき、戻るボタンを押せばRootViewController(navigationControllerの最初の画面)であるHogeViewControllerに戻る
- .... -> FooViewController -> PiyoViewController のとき、戻るボタンを押せばFooViewControllerに戻る
というのを実装したい。
アーキテクチャ
VIPER
実装
以下はRouter内に実装した。
func segueToOrigin() { guard let vc = self.navigationController?.viewControllers.first(where: { $0 is FooViewController }) else { navigationController?.popToRootViewController(animated: true) return } navigationController?.popToViewController(vc, animated: true) }
first(where:)は配列内に条件に一致する要素があればそれを返すというもの。 https://developer.apple.com/documentation/swift/array/1848165-first
今回はnavigationController内のviewControllersにFooViewControllerというクラス名と一致するものがないなら、RootViewControllerに遷移し、FooViewControllerと一致するものがあるならFooViewControllerに遷移する、という流れになっている。
ちなみにnavigationの先頭に戻る時は、popToRootViewControllerを使う。 https://developer.apple.com/documentation/uikit/uinavigationcontroller/1621855-poptorootviewcontroller
ViewControllerを指定して戻る時はpopToViewControllerを使う。 https://developer.apple.com/documentation/uikit/uinavigationcontroller/1621871-poptoviewcontroller