在Xcode 6中的'Show' segue在iOS 7中将视图控制器呈现为模态视图。

28

我在我的iPhone应用程序中有两个视图控制器(用Swift构建),使用Xcode 6.1和storyboards。

第一个视图控制器在storyboard中嵌入了一个导航控制器,第二个视图控制器的segue是“Show” segue。

当应用程序运行时,在iOS 8.x中它会正确显示转换为“push”,但在iOS 7.x中它会出现模态窗口且没有导航栏。

我的应用程序要求在iOS 7或iOS 8中都显示为“push”。有什么办法可以让这在两个版本的iOS中都实现“push”?

我看到了一个相关的帖子提到了这个问题,但找不到解决问题的方法:Adaptive segue in storyboard Xcode 6. Is push deprecated?

感谢任何帮助...

谢谢

11个回答

22
这个解决方案与其他方案的区别如下:
  1. 它包括一种检查和验证问题的方法
  2. 问题的原因追溯到源头(segue类型的更改)
  3. 解决方案非常简单(删除并重新创建一个新的segue)
  4. 请注意文本中的要求
我刚刚在Stack Overflow上给出了一个非常详细的答案,完全解释了发生了什么以及为什么,但简单的解决方案是删除不推送的Segue,然后在故事板中重新创建它。原因是在segue中可能存在破损的xml代码(请参见扩展答案以获取示例/确认此问题的说明)。
在确认视图层次结构中至少有一个UINavigationController之后,请确保segue不是手动segue,并且没有与其关联的操作(通过在Storyboard中查看segue的源代码)。删除现有的segue,然后从UIView/UIControl Ctrl-drag到目标视图控制器上,如果需要自定义操作,则在prepareForSegue中截取对目标控制器的调用。
另外,为了确认这个解决方案是否适用于您,请执行以下操作:
  • 验证您的初始视图控制器(带有箭头的那个)是否为UINavigationController,并且它有一个正常的内容视图控制器作为其根视图控制器。(或者您将初始视图控制器嵌入到UINavigationController中)
  • 阅读我对非常相似的问题的早期响应的扩展评论(链接如上所述)。

哇,这个问题已经存在很长时间了,苹果公司仍然没有解决它!感谢您的帮助,拯救了我的局面,我对此一直很苦恼。 - Yuri Brigance
在Xcode beta 9.2中仍然有用,这是我7年开发中从未见过的。删除并重新创建Navcontroller和segue就解决了问题。 - Rocket Garden

12

可能您已经将 Initial View Controller 分配给了 UIViewController,而不是 UINavigationController。同时,选择您的 UIViewController 并检查 "Is Initial View Controller" 选项是否取消选中。

将 UINavigationController 设置为 Initial View Controller


我在第二个视图控制器那里遇到了问题。初始视图控制器正确地设置为 UINavigation 控制器,位于第一个视图控制器之前。 - momentsnapper
我刚在一个新项目中尝试了一下,对于iOS7和iOS8都可以正常工作。你是否设置了第一个视图控制器和第二个视图控制器之间的segue?能否提供更多信息? - jomafer
1
啊,问题几乎是一样的。我的两个ViewC在不同的storyboard中,第二个storyboard没有导航控制器。将ViewC嵌入到NavC中,问题解决了。谢谢。 - momentsnapper

6

我认为这是Xcode 7.2中的一个错误。为了解决问题,您可以创建一个“Push(已弃用)”连线,然后在Storyboard编辑器中选择该连线并将其更改为Show(例如Push)。


我在Xcode 7.2中尝试了这个,但在启动时出现了异常:“不支持推送导航控制器”。 - Jervisbay
确保您首先将segue添加到目标视图控制器。然后将目标视图控制器嵌入导航控制器中。 - Arunabh Das

6

这里提供了解决方法。看起来是iOS 7的Xcode中的一个bug。您需要创建一个虚拟的UINavigationController并将所有免费的UIViewControllers链接到此导航控制器。对我有用。


6
对于我来说,我的故事板缺少一个导航控制器。 我通过编程方式创建了导航控制器,在iOS8中可以正常工作,但在iOS7中不行。 解决方法
  1. 在你的故事板中选择主视图控制器,然后在Xcode菜单中选择Editor > Embed In > Navigation Controller
  2. 选择新的导航控制器,在右侧的属性检查器中,在View Controller下,确保选中了Is Initial View Controller
  3. 运行应用程序。 现在应该已经修复了。

3

我长期以来一直遇到“显示(例如推送)”的这个问题,当我试图将一个视图控制器推到一个弹出窗口中的导航控制器时,我刚刚解决了这个问题。看来被调用的视图控制器的上下文是问题所在。所以这就是我的解决方法:

  1. 在执行Segue的视图控制器中,检查Storyboard中的“定义上下文”属性。
  2. 在被调用的视图控制器中,将Presentation属性设置为“当前上下文”。

2
我遇到了这个问题,我找到的唯一解决方法是使用不推荐使用的“Push”转场。

使用已弃用的项目是我通常想要避免的。通过将第一个ViewC嵌入到我的第二个故事板中的NavC中,我成功地使其工作。 - momentsnapper

2
我正在使用Swift 4的XCode 9。请注意,这个版本是昨天(9月20日)发布的。
对我来说,这只是一个缓存错误。我必须选择“模态呈现”,运行应用程序,然后选择“显示(例如推送)”。现在一切都正常工作了。

哇!从来没有想到过这个问题!在Xcode 9.2 (9C40b)中因为这个bug而遭受了很多痛苦。感谢您发布这个信息! - Nitin Alabur

1
基本上,Jomafer的答案部分正确。您正在推送的控制器需要在UINavigationController之前。您实际上不需要推送UINavigationController。只要故事板知道它在UINavigationController中,一切都很好。

1

当在测试中以模态形式呈现“Show” segue时,通常是以下两个问题之一:

  1. 第一个视图控制器不在导航控制器中。

  2. Storyboard XML 文件已损坏。

解决问题2的方法通常是删除并替换 segue,这样它应该就会自行纠正。有时只需切换到其他展示样式,运行并切换回 “Show”,即可解决问题。

这种情况也可能发生在 "Show Detail" segue 中,而且可能更加隐蔽。

例子: 我有一系列的视图控制器,排列在一个UISplitViewController中。它们有一个连续的segue:Show->Show->Show->Show Detail。最后一个segue一直以模态方式出现。我尝试了所有方法来修复这个最后的segue。问题是上游 Show segue已经被损坏成了一个Show Detail segue(即使故事板仍然显示它是一个Show segue)。我一直在iPhone上测试,直到我在iPad模拟器上运行时才发现真正的问题。现在的segues是Show->Show->Show Detail->Show Detail。在iPhone上,第三个segue看起来就像一个Show,因为它折叠到导航控制器上。然而,它仍然是详细信息视图控制器,您不能从详细视图控制器中显示详情,因此操作系统会尽力让您的视图控制器出现在屏幕上并以模态方式显示它。

教训1:始终在iPad上测试您的UISplitViewController以确保segue正在执行您想要的操作。

教训2:如果您的segue意外地以模态方式出现,请检查上游 segues是否也存在损坏,以及相关的segue。


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