关于ios:针对push segue的PerformSegueWithIdentifier的程序中断

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-我的故事板:

enter image description here

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

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

我正在将一个值从登录控制器传递给主控制器。当我添加导航控制器时,无法传递此值。如何传递此值?

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

用我的话说解决方案:

感谢分享答案的人:)我解决了这个问题。在导航控制器堆栈中,如果我放了一个模态信号,不知何故链接断了,其余的视图不是导航控制器的一部分。所以,我把所有的细分都称为"推送式"。然后在主控制器中。我取下了后退按钮,如下所示:

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。

converging segues

我希望这有帮助。


它不起作用,因为您正在触发routeListsegue,该控制器以模态显示,不包含在导航控制器中。

您可能希望交换您的层次结构,以便主视图位于nav controller(窗口根视图控制器)中,并且登录屏幕以模式显示(登录完成后将被取消)。

从一些不同的事情开始:删除所有的模态段并使它们被推。接下来,在主视图控制器中,实现viewDidAppear:以获取导航控制器,并将其视图控制器设置为仅@[ self ](这将删除登录视图控制器)。这将消除您的即时问题。