针对push segue的PerformSegueWithIdentifier程序中断

时间:2013-11-21 15:03:44

标签: ios objective-c segue uistoryboardsegue

我有一个登录视图。如果登录成功完成,我想要我的程序,导航到主窗口。

我在登录视图和主视图之间使用了模态segue。

然而,在达到主视图后,我想使用push segues,不幸的是我面临以下异常:

Terminating app due to uncaught exception 'NSGenericException', reason: 
'Could not find a navigation controller for segue 'routeList'. 
Push segues can only be used when the source controller is managed by an 
instance of UINavigationController.'

以下是我在“登录控制器”中为“模态segue”命令的函数:

//LoginController.m
- (IBAction)loginTapped:(id)sender {
     [self performSegueWithIdentifier:@"login" sender:@{@"foo": @"bar"}];
}

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if ([[segue identifier] isEqualToString:@"login"])
    {
        MainController *vc = segue.destinationViewController;
        vc.uuid = userUuid;
    }
}

以下是我用于在“主控制器”中执行“推送segue”的功能。我想在这里执行推送segue,我在这一部分面临例外。

//MainController.m
- (IBAction)actionGo:(id)sender {
     [self performSegueWithIdentifier:@"routeList" sender:self];
}

事实上,我在“登录视图”之前有一个导航控制器。那为什么它找不到“导航控制器”呢?

如果我使用模态segue,它可以工作。那么为什么它不适用于push segue?

编辑1 - 我的故事板:

enter image description here

编辑2 - 建议将主控制器嵌入导航控制器(单击routeList segue的源控制器,然后在编辑器菜单下选择嵌入>导航控制器)。现在,我的故事板在下面给出,我现在面临这个错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', 
reason: '-[UINavigationController setUuid:]: unrecognized selector sent to 
instance 0x17da9df0'

我将一个值从登录控制器传递给主控制器。当我添加导航控制器时,我无法传递此值。我怎样才能传递这个值?

当MainController嵌入到导航控制器中时的故事板: enter image description here

解决我的问题:

感谢在这个帖子中分享了他们回答的人:)我解决了这个问题。在导航控制器堆栈中, 如果我放一个模态segue,不知何故链接被破坏,其余的视图不是导航控制器的一部分。所以,我把所有的段落都称为“推式”。然后在MainController.m中 我按如下方式删除了后退按钮:

-(void)viewDidAppear:(BOOL)animated{
    [self.navigationItem setHidesBackButton:YES animated:NO];
} 

2 个答案:

答案 0 :(得分:1)

它不起作用,因为您从控制器触发routeList segue,该控制器以模态方式显示且未包含在导航控制器中。

您可能希望交换层次结构,以便主视图位于导航控制器中,该控制器是窗口根视图控制器,登录屏幕以模态方式显示(并在登录完成时被解除)。


从不同的东西开始:删除所有模态segue并使它们推动。接下来,在主视图控制器中,实现viewDidAppear:以获取导航控制器并将其视图控制器设置为仅@[ self ](这将删除登录视图控制器)。这应该可以消除您的直接问题。

答案 1 :(得分:1)

请根据您的错误注意以下建议:

  

由于未捕获的异常'NSGenericException'而终止应用,   原因:'找不到segue'routeList'

的导航控制器

<强>推荐

事实上,我在“登录视图”之前有一个导航控制器。那为什么它找不到“导航控制器”呢?

故事板的图片有助于评估问题。您可以通过多种方式检查导航控制器的可用性。确保源控制器嵌入导航控制器的一种方法是单击routeList segue的源控制器,并在Editor菜单下选择Embed In&gt;导航控制器

顺便说一下,如果我使用模态segue,它就可以了。为什么它不适用于push segue

推送segues需要导航控制器,而模态segue不需要导航控制器。这是一个相关的问题,可以更好地解释差异(stack overflow link)。

更新1

您提到您还想在控制器之间传递值。在目标VC上创建一个属性来保存UserID。在源视图控制器上,您需要设置目标属性的值并在prepareForSegue方法中传递数据。以下是有关如何从其他SO Q&A执行此操作的链接。

更新2

您提到您的segues是推送segue但问题中显示的图片并未表明这一点...请注意推送segues的图标,如下图所示。您还需要确保命名两个融合段。我把我的push segues routeA和routeB称为。

converging segues

我希望这会有所帮助。