UINavigationContoller で navigation stack の階層を変えずに画面遷移する方法

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

画面の差し替え

Pop and Push

↑こんな挙動をさせたいと思ったことはありませんか?

ViewController の pop をアニメーション無しで、push をアニメーションありで・・・
そんなことは不要です。

setViewControllers

UINavigationController の navigation stack を一気に更新したい場合はsetViewControllers:animated:メソッドを利用します。

NavigarionController によって管理される Root, A, B という 3 つの画面(ViewController)があるとします。

画面遷移

-の後ろは navigation stack を表現しています。

  1. Root を表示 - Root
  2. A に遷移 - Root / A
  3. B に遷移 - Root / B <- こうしたい!(普通なら Root / A / B となる)

サンプルコード

画面 A から画面 B に遷移する時の処理

NSMutableArray *viewControllers = [self.navigationController.viewControllers mutableCopy];
[viewControllers removeLastObject];

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *BViewContorller = [storyboard instantiateViewControllerWithIdentifier:@"B"];
[viewControllers addObject:BViewContorller];

[self.navigationController setViewControllers:[viewControllers copy] animated:YES];

実行動画

まとめ

UINavigationController クラスのsetViewControllers:animated:メソッドを使えば、とても簡単に画面の差し替えが実現できます。
動的に navigation stack を更新したい場合は試してみてください。

リファレンスを見てみるとAvailable in iOS 3.0 and later.と書かれています。
かなり昔からあるメソッドのようですね。
・・・私は昨日知りました(泣)

リンク