1

我正在启用 iOS 6.0 故事板

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

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

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''

我错过了什么?

4

1 回答 1

2

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

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

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

但是,我认为这里的问题是 pop 动画会与 segue 冲突。使用 ...Animated: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];
    }
}
于 2013-01-19T18:31:05.330 回答