NSGenericException', reason: '只有在源控制器由UINavigationController的实例管理时,才能使用Push segues。

52

我正在制作一个包含5个视图控制器的应用程序,第一个视图控制器嵌入了一个UINavigationController,并且前4个视图控制器之间的segue可以正常工作。然而,引入第五个视图控制器破坏了这一点,我遇到了错误。

Terminating app due to uncaught exception 'NSGenericException', reason: 'Push segues can only be used when the source controller is managed by an instance of UINavigationController.'

这第五个视图控制器我并没有做任何不同的操作,它只是一个标准的视图控制器,其中包含了一个图片视图和一个标签。所有的Segue都是通过在Storyboard中使用Ctrl+拖动按钮来调用的。有人知道这是什么原因吗?

谢谢

11个回答

154

将导航控制器添加到你的初始视图

  1. 选择初始视图
  2. 转到 编辑 --> 嵌入 --> 导航控制器

10
可能是因为OP已经明确表示他已经将所有的视图控制器嵌入到了一个UINavigationController中。在我的项目中,我也遇到了完全相同的问题。很明显,这些视图控制器已经被嵌入到UINavigationController中,这可以从导航栏中的“<返回”按钮看出来。 - NathanAldenSr
1
太棒了。简洁的回答,节省了我很多时间,并解决了一个障碍。+1 - voghDev
1
我遇到了这个问题,是因为在“push” segue 之前使用了“modal” segue。将第一个segue更改为“push”,问题解决了。 - PhillipOReilly

15

在Storyboard中将UINavigationController设置为初始视图控制器(Initial Scene)。


这正是我所错过的。 - tontonCD

14

在我的情况下,当原始 VC 执行 segue 时,导航控制器正在过渡并已更改可见的 VC。

我通过以下方式解决了这个问题:

if (self.navigationController.visibleViewController == self) {
    [self performSegueWithIdentifier:@"thankyou" sender:self];
}

不再崩溃。:)


2
它可以工作... 当通过NSNotification触发segue时更有用。 - John Paul Manoza
很好的答案。也帮助了我在通过通知触发时。 - Adam G

4
这很可能是因为你从按钮或其他地方的 push segue 指向了一个视图控制器,而不是你的视图控制器继承的导航视图控制器。所以,你必须将 segue 指向导航控制器。
希望这会有所帮助。

1
你只需要将导航控制器嵌入到源视图控制器中(即初始视图,而不是你要推送的视图)。这可以通过选择源视图控制器并进入“编辑器”菜单 -> “嵌入” -> “导航控制器”来完成。
如果你认为导航控制器已经添加了导航栏。只需选择导航控制器,在“显示属性检查器”中禁用“显示导航栏”即可。

1
在我的特定情况下,需要调用一些视图子集的地方只能通过代码调用,而不能通过IB连接。创建视图子集的原始项目是通过专用按钮开始的,因此可以使用IB。没有可配置的分流,因此任何推送都会导致此错误。
我的解决方法很简单: [self showViewController:targetViewController sender:self];

0

如果您正在使用UIViewController类

那么请检查segue标识符的声明中的一件事情 例如,您已经设置了

标识符:MySegue1 Segue:以模态方式呈现(如果您正在使用UIViewController类,请选择此选项)

演示:默认值 转换:默认值

并且再检查一下您的对象声明是否正确

也许我的答案不完全正确,但这就是我所知道的关于这个错误的所有信息。 希望它能对您有所帮助。


0

我曾经遇到过和你一样的问题。

我的问题是,我在调用一个segue的标识符时,这个segue并不能从我所在的类中访问。我通过直接向ViewController添加另一个segue来解决了这个问题,这个ViewController可以访问我正在使用的类。希望这可以帮到你。


0

我曾经遇到过同样的问题,几分钟后我就解决了它。

我删除了segue连接,然后再次从一个视图到其他视图建立了连接。问题就这样解决了。 关键是我删除了一些视图,并对story board场景中的视图进行了一些更改。 重要的是,您需要检查连接是否正常从一个视图到另一个视图。

希望这对某人有所帮助....


0

我曾经遇到过同样的问题,搜索了很多资料但都没有帮助我。我试了很多方法,最终找到了解决方案。

我正在使用 Xcode 5 做一个项目,并使用故事板开发视图。我有 3 个屏幕,我的连接是:

view1 到 view2 --> push

view2 到 view3 --> push

view2 到 view1 --> 模态(这是我的错误,我们需要使用 push)

这个可以正常工作,但我在 view2 中放置了导航栏按钮(返回),并使用了模态连线。当我点击 view2 的导航栏按钮时,它正确地重定向到 view1,但当我尝试从 view1 前往 view2 时,却出现了相同的错误。

因为如果你从源视图到目标视图给出 push segue 类型,你需要在目标视图到源视图也使用相同的 push segue 类型。

我希望对某些人有所帮助...谢谢


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接