中村的雑記

技術に関する記事を書いていきます。iOSエンジニア->Railsエンジニア。

遷移元が複数ある時の画面遷移

はじめに

遷移元が複数あって、その遷移元に戻るという実装に詰まったのでメモをしていく。

  • 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