我有一个登录视图。如果登录成功完成,我想要我的程序,导航到主窗口。
我在登录视图和主视图之间使用了模态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 - 我的故事板:
编辑2 - 建议将主控制器嵌入导航控制器(单击routeList segue的源控制器,然后在编辑器菜单下选择嵌入>导航控制器)。现在,我的故事板在下面给出,我现在面临这个错误:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '-[UINavigationController setUuid:]: unrecognized selector sent to
instance 0x17da9df0'
我将一个值从登录控制器传递给主控制器。当我添加导航控制器时,我无法传递此值。我怎样才能传递这个值?
当MainController嵌入到导航控制器中时的故事板:
解决我的问题:
感谢在这个帖子中分享了他们回答的人:)我解决了这个问题。在导航控制器堆栈中, 如果我放一个模态segue,不知何故链接被破坏,其余的视图不是导航控制器的一部分。所以,我把所有的段落都称为“推式”。然后在MainController.m中 我按如下方式删除了后退按钮:
-(void)viewDidAppear:(BOOL)animated{
[self.navigationItem setHidesBackButton:YES animated:NO];
}
答案 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称为。
我希望这会有所帮助。