Program breaks at PerformSegueWithIdentifier for push segue
我有一个登录视图。如果登录成功,我想要我的程序,导航到主窗口。
我在登录视图和主视图之间使用了模式segue。
但是,在进入主视图后,我想使用推送段,不幸的是,我遇到了以下异常:
1 2 3 4 | 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"提供的命令的函数:
1 2 3 4 5 6 7 8 9 10 11 12 | //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; } } |
以下是我在"主控制器"中执行"推送信号"的功能。我想在这里执行一个push segue,在这一部分中我将面对异常。
1 2 3 4 | //MainController.m - (IBAction)actionGo:(id)sender { [self performSegueWithIdentifier:@"routeList" sender:self]; } |
实际上,在"登录视图"之前我有一个导航控制器。为什么找不到"导航控制器"?
如果我使用模态segue,它会起作用。那为什么它对Push Segue不起作用呢?
编辑1-我的故事板:
编辑2-建议将主控制器嵌入导航控制器中(单击RouteList Segue的源控制器,然后在编辑器菜单下选择嵌入>导航控制器)。下面是我的故事板,现在我面临这个错误:
1 2 3 | *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UINavigationController setUuid:]: unrecognized selector sent to instance 0x17da9df0' |
我正在将一个值从登录控制器传递给主控制器。当我添加导航控制器时,无法传递此值。如何传递此值?
当主控制器嵌入导航控制器时的故事板:
用我的话说解决方案:
感谢分享答案的人:)我解决了这个问题。在导航控制器堆栈中,如果我放了一个模态信号,不知何故链接断了,其余的视图不是导航控制器的一部分。所以,我把所有的细分都称为"推送式"。然后在主控制器中。我取下了后退按钮,如下所示:
1 2 3 | -(void)viewDidAppear:(BOOL)animated{ [self.navigationItem setHidesBackButton:YES animated:NO]; } |
请根据您的错误注意以下建议:
Terminating app due to uncaught exception 'NSGenericException',
reason: 'Could not find a navigation controller for segue 'routeList'
建议
实际上,在"登录视图"之前我有一个导航控制器。为什么找不到"导航控制器"?
故事板的图片将有助于评估问题。您可以通过多种方式检查导航控制器的可用性。确保源控制器嵌入导航控制器的一种方法是单击RouteList Segue的源控制器,然后在编辑器菜单下选择嵌入>导航控制器。
顺便说一下,如果我使用模态segue,它会起作用。为什么不适用于Push Segue?
推送段需要导航控制器,而模式段不需要导航控制器。这里有一个相关的问题可以更好地解释这些区别(堆栈溢出链接)。
更新1:
您提到还希望在控制器之间传递值。在目标vc上创建一个保存用户ID的属性。在源代码视图控制器上,您需要设置目标属性的值,并在PrepareForSegue方法中传递数据。这里有一个关于如何从另一个SO Q&A进行此操作的链接。
更新2
你提到你的segues是push segues,但问题中显示的图片并没有说明这一点…请注意下面我的图片中概述的推送段图标。您还需要确保您命名了两个聚合段。我叫我的Push Segues RouteA和RouteB。
我希望这有帮助。
它不起作用,因为您正在触发
您可能希望交换您的层次结构,以便主视图位于nav controller(窗口根视图控制器)中,并且登录屏幕以模式显示(登录完成后将被取消)。
从一些不同的事情开始:删除所有的模态段并使它们被推。接下来,在主视图控制器中,实现