弹出root然后在iPhone上执行segue

时间:2013-01-19 18:23:31

标签: iphone ios uinavigationcontroller storyboard uistoryboardsegue

我在启用iOS 6.0故事板上运行

我有一个链接到TableViewController的NavController。 这个TableView可以转换为AViewController或BViewController。

当我在A中时,我想回到根目录并使用以下行执行segue到B:

UINavigationController *nav = self.navigationController;
[nav popToRootViewControllerAnimated:YES];
[nav performSegueWithIdentifier:@"GoToB" sender:self];

我检查了故事板,GoToB确实存在并且从TableViewController链接到BViewController

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Receiver (<NavMainViewController: 0xb921fa0>) has no segue with identifier 'GoToB''

我错过了什么?

1 个答案:

答案 0 :(得分:2)

segue将附加到您弹出的视图控制器,而不是nav,它是包含它的容器视图控制器。所以这会更接近:

UINavigationController *nav = self.navigationController;
[nav popToRootViewControllerAnimated:YES];

UIViewController *rootVC = [nav.viewControllers objectAtIndex:0];
[rootVC performSegueWithIdentifier:@"GoToB" sender:self];

但是,我认为这里的问题是pop动画会与segue发生冲突。使用弹出式弹出:动画:NO可能会修复它,但我认为从rootVC执行segue会更正确(并且对于动画更加健壮)。

rootVC将实现viewDidAppear,如下所示:

- (void)viewDidAppear:(BOOL)animated {

    [super viewDidAppear:animated];
    if (!self.isBeingPresented && /* any other condition that makes you want this */) {
        [self performSegueWithIdentifier:@"GoToB" sender:self];
    }
}