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