【问题标题】:'Show' segue in Xcode 6 presents the viewcontroller as a modal in iOS 7Xcode 6 中的“显示”segue 将视图控制器呈现为 iOS 7 中的模式
【发布时间】:2014-12-26 06:27:06
【问题描述】:

我的 iPhone 应用程序(使用 swift 构建)中有两个视图控制器,使用 Xcode 6.1 构建并使用情节提要。

第一个视图控制器嵌入在故事板的导航控制器中,第二个视图控制器的转场是“显示”转场。

当应用程序运行时,它在 iOS 8.x 中正确地将转换显示为推送,但在 iOS 7.x 中,它显示为没有导航栏的模式。

我的应用程序要求是将转换显示为推送,无论是 iOS 7 还是 iOS 8。有什么想法可以在两个版本的 iOS 中实现推送?

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

感谢任何帮助...

谢谢

【问题讨论】:

    标签: ios swift uistoryboardsegue


    【解决方案1】:

    此解决方案在以下方面与其他解决方案不同:

    1. 它包括一种检查和验证问题的方法
    2. 问题原因追查到源头(segue 类型发生变化)
    3. 解决方法很简单(删除并重新创建一个新的segue)
    4. 请注意文中的要求

    我刚刚给出了一个very detailed SO answer,它完全解释了正在发生的事情以及原因,但简单的解决方案是您可以删除未推送的 Segue,然后在情节提要上重新创建它。原因是 segue 中可能有一些 xml 损坏(请参阅扩展答案示例/说明如何确认此问题)。

    在确认视图层次结构中至少有一个 UINavigationController 后,请确保 segue 不是手动 segue 并且没有与之关联的操作(通过将故事板中的 segue 作为源代码查看)。删除现有的 segue,然后按住 Ctrl 键从 UIView/UIControl 拖动到目标视图控制器,如果需要自定义操作,则在 prepareForSegue 中拦截对目标控制器的调用。

    还要确认此解决方案对您有效,请执行以下操作 以下:

    • 验证您的初始视图控制器(带有箭头)是 UINavigationController 并且它具有正常的内容视图 控制器作为它的根视图控制器。 (或者你嵌入你的 UINavigationController 内的初始视图控制器)
    • 阅读我的扩展 cmets 对一个非常相似的问题的较早回复(上面链接)。

    【讨论】:

    • 哇,这个问题已经存在很长时间了,Apple 仍然没有修复它!谢谢你救了我的培根,把我的头发扯掉了..
    • 在 Xcode beta 9.2 中仍然有用,在 7 年的开发中从未见过。删除并重新创建 Navcontroller 和 segue 就可以了。
    【解决方案2】:

    您可能已将初始视图控制器分配给您的 UIViewController 而不是 UINavigationController。另外,选择您的 UIViewController 并检查“是初始视图控制器”选项是否未选中。

    【讨论】:

    • 第二个视图控制器有问题。初始视图控制器在第一个视图控制器之前正确设置为 UINavigation 控制器
    • 我刚刚尝试了一个新项目,并且适用于 iOS7 和 iOS8。您是否在第一个和第二个视图控制器之间设置了segue?你能提供更多信息吗?
    • 啊。这个问题几乎是一样的。我的两个 viewC 位于不同的故事板中,而第二个故事板没有导航控制器。将 viewC 嵌入到 navC 中并修复了它。谢谢
    【解决方案3】:

    Here 是解决此问题的方法。它看起来像 iOS 7 的 Xcode 中的一个错误。您需要创建一个虚拟 UINavigationController 并将所有免费的 UIViewController 链接到此导航控制器。为我工作。

    【讨论】:

      【解决方案4】:

      对我来说,我的故事板缺少导航控制器。我正在以编程方式创建导航控制器,它在 iOS8 中运行良好,但在 iOS7 中运行良好。

      解决方案

      1. 在情节提要中,选择主视图控制器,然后在 Xcode 菜单中,选择 Editor > Embed In > Navigation Controller
      2. 选择新的导航控制器,并在右侧的属性检查器中,在 View Controller 下,确保选中 Is Initial View Controller
      3. 运行应用程序。现在应该修好了。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 我在 Xcode 7.2 中尝试过,但在启动时出现异常:“不支持推送导航控制器”
        • 确保先将 segue 添加到 targetVC。然后在 NavigationController 中嵌入 targetVC。
        【解决方案6】:

        多年来,我一直在“显示(例如推送)”中遇到这个确切的问题,我只是在尝试将视图控制器推送到弹出框中的导航控制器时才弄清楚。似乎被调用的 View Controller 的上下文是问题所在。所以这就是我解决它的方法:

        1. 在执行 Segue 的 View Controller 上,检查 Storyboard 中的“Defines Context”属性。
        2. 在被调用的 View Controller 中,将 Presentation 属性设置为“Current Context”。

        【讨论】:

          【解决方案7】:

          我遇到了这个问题,我发现对我有用的唯一解决方案是使用已弃用的“Push”segue。

          【讨论】:

          • 使用过时的物品是我通常想要避免的。我能够通过将第一个 ViewC 嵌入到 NavC 中的第二个故事板中来实现此功能
          【解决方案8】:

          我正在使用 XCode 9 和 Swift 4。注意这个版本是昨天(9 月 20 日)发布的。

          对我来说,这只是一个缓存错误。我必须选择“Present Modally”,运行应用程序,然后选择“显示(例如推送)”。现在一切正常。

          【讨论】:

          • 哇!绝对不会想到这一点!由于 Xcode 9.2 (9C40b) 中的这个错误而受到影响。感谢您发布此信息!
          【解决方案9】:

          Jomafer 的回答基本上是部分正确的。您要推送的控制器前面需要有 UINavigationController。您根本不需要推动 UINavigationController。只要故事板知道它在 UINavigationController 中,一切都很好。

          【讨论】:

            【解决方案10】:

            当“显示”转场作为模态转场出现在测试中时,通常是以下两个问题之一:

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

            2. 情节提要 XML 已损坏。

            #2 的解决方案通常是删除和替换 segue,它应该会自行纠正。有时只需切换到其他演示样式、运行并切换回“显示”即可解决问题。

            这也可能发生在“显示细节”的转场中,而且可能更加隐蔽。

            示例: 我有一系列视图控制器排列在 UISplitViewController 中。他们有segues Show->Show->Show->Show Detail。最后一个segue不断出现模态。我尝试了一切来修复最后的转场。问题是 upstream Show segue 已损坏为 Show Detail segue(即使情节提要仍然说它是 Show segue)。我一直在 iPhone 上测试,直到我在 iPad 模拟器上运行它才发现真正的问题。转场现在是 Show->Show->Show Detail->Show Detail。在 iPhone 上,第三个 segue 看起来就像一个 Show,因为它折叠到导航控制器上。但是,它仍然是 detail 视图控制器,并且您不能拥有一个 Show Detail from 详细视图控制器,因此操作系统会尽其所能来启动您的视图控制器屏幕并以模态方式显示。

            第 1 课:始终在 iPad 上测试您的 UISplitViewController 以确保 segues 按照您的想法进行。

            第 2 课:如果您的 segue 意外出现模态,请检查 upstream segue 是否损坏以及有问题的 segue。

            【讨论】:

              【解决方案11】:

              我的问题是我在将 ViewController 作为 UINavigationController 的 rootViewController 之前创建了 Show(例如 Push)segue。换句话说,我没有 UINavigationController。 然后我删除了序列,添加了 UINavigationController 并再次添加了序列,它起作用了。在 Xcode 9.0.1 / iOS 11.0.3 上测试。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2017-05-13
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-09-15
                • 2016-02-03
                相关资源
                最近更新 更多