これを実現するには、ViewController3 で戻るボタン イベントをインターセプトし、unwindSegues を使用します。戻るボタン イベントをインターセプトする方法については、この質問に対する William Jockusch の回答を参照してください。
この特定のケースでアンワインド セグエを使用するには、次のことを行う必要があります。
1)ViewController1で次のようなメソッドを作成します
- (IBAction)unwindToThisViewController:(UIStoryboardSegue *)unwindSegue
{
NSLog(@"Rolled back");
}
2) ストーリーボードのズームアウトで、ViewController3 から ViewController3 シーンに含まれる左側の「終了」緑色のボックス (赤いボックスの First Responder とすべてのコントローラー ビューのサブビューと共に) に ctrl キーを押しながらドラッグします。アンワインド セグエを接続する IBAction を尋ねるポップアップ ウィンドウが表示され、unwindToThisViewController
作成したばかりのアクションを選択できるはずです。これにより、アンワインド セグエが作成されます。
3) シーン ボックスからこのアンワインド セグエを選択し、「unwindToStart」などの ID を指定します。
4) 最後に、ViewController3 クラスで、viewWillDisappear
次のようにメソッドをオーバーライドします。
-(void) viewWillDisappear:(BOOL)animated
{
if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound)
[self performSegueWithIdentifier:@"unwindToStart" sender:self];
[super viewWillDisappear:animated];
}
これにより、戻るボタン イベントがインターセプトされ、ViewController1 に展開されます。
編集: アンワインド セグエは iOS 6 以降でのみサポートされているため、以前のバージョンの iOS でこの機能が必要な場合、唯一の方法は、ViewController3 の viewDidLoad の NavigationController スタックから ViewController2 を手動で削除することだと思います。次のコードのようなことを行う必要があります。
- (void)viewDidLoad
{
NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:self.navigationController.viewControllers];
for(UIViewController* vc in self.navigationController.viewControllers)
{
if ([vc isKindOfClass:[ViewController2 class]]) {
[viewControllers removeObject:vc];
break;
}
}
self.navigationController.viewControllers = [NSArray arrayWithArray:viewControllers];
// Do any additional setup after loading the view.
}