您可以通过拦截 ViewController3 中的后退按钮事件并使用 unwindSegues 来实现此目的。
查看 William Jockusch 对此的回复question https://stackoverflow.com/questions/1214965/setting-action-for-back-button-in-navigation-controller了解如何拦截后退按钮事件。
要在这种特殊情况下使用 unwind segues,您需要:
1)在你的ViewController1中创建一个方法,例如
- (IBAction)unwindToThisViewController:(UIStoryboardSegue *)unwindSegue
{
NSLog(@"Rolled back");
}
2) 在故事板中缩小,然后按住 Ctrl 键并从 ViewController3 拖动到 ViewController3 场景中左侧包含的“退出”绿色框(以及红色框第一响应者和所有控制器视图的子视图)。将显示一个弹出窗口,询问您要将展开转场连接到哪个 IBAction,您应该能够选择unwindToThisViewController
您刚刚创建的操作。这将创建一个展开转场。
3) 从场景框中选择这个 unwind segue 并给它一个 ID,例如“unwindToStart”
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.
}