2017年2月17日金曜日

NavigationController に積まれたスタックを削除する方法

概要

NavigationController を使って View の遷移を実装していると戻るボタンが自動で作られると思います
基本的に戻るボタンは 1 つ前の View にしか戻ることができません
戻るための View の情報は NavigationController にスタック形式で保存されています
遷移したら遷移した View が Push され、戻るときにその View を Pop します
今回はそのスタックを意図的に書き換える方法を紹介します

環境

  • Mac OS X 10.11.5
  • Xcode 7.3.1

スタックを書き換える方法

NavigationController の setViewControllers というメソッドを使って書き換えることができます
具体的には以下のように実装します

let view1 = self.storyboard?.instantiateViewControllerWithIdentifier("View1") as! View1
let view2 = self.storyboard?.instantiateViewControllerWithIdentifier("View2") as! View2
self.navigationController?.setViewControllers([view1, view2], animated: true)

スタックに積む対象の View を取得します
今回は、Storyboard で作成した View1 と View2 を取得しています
instantiateViewControllerWithIdentifier を使って View の情報を取得する場合は Storyboard で 各種 View に StoryboardID を振っておく必要があります

上記のように setViewControllers が呼ばれると、まず view2 に移動します
そしてスタックには view1 が Push されることになります
なので、戻るボタンを押すと view1 に移動することができるようになります

setViewControllers の引数の 1 つ目は配列を指定することができます
なので、サンプルでは 1 つ分のスタック (view1) を積んでいますが 2 つ, 3 つとスタックを積むことができます

使うケースとしては例えば
A -> B -> C -> D -> E -> B と遷移する場合に B のあとに E に戻ることはさせたくありません
E が登録完了画面などになっていて E に戻れてしまうと二重登録などが起きてしまうためです
そんな場合には A と B の View を setViewControllers に設定すれば E に戻ることはなくなります

最後に

NavigationController を使って開発している場合には覚えておいて損はない機能だと思います

今回の動作は Storyboard だけでは実現できません
Storyboard で実現出来ない処理はどうしてもコード側で実装しなければいけなくなります

0 件のコメント:

コメントを投稿