为什么故事板弹出窗口 segue 出现在导航控制器内的后续视图中

Why is a storyboard popover segue appearing on a subsequent view within a navigation controller

这很奇怪,但我会尽力解释。

我有一个有视图的导航控制器。该视图提出了一个简单的问题。然后该视图有两个可用的 segues——一个在正确答案的视图上,它是导航控制器上的 "show",另一个在不正确的答案上,它是 "popover".

segue 分别绑定到显示和弹出窗口的视图和答案框。

我正在测试按下按钮时的答案,然后使用 performSegueWithIdentifier 显示适当的 window。

if (answerField.text == "2") {
        println("Correct")
        performSegueWithIdentifier("Correct", sender: sender)
    } else {
        println("Incorrect")
        performSegueWithIdentifier("Error", sender: sender)
    }

我遇到的问题是,如果我得到正确的答案,它会很好地移动到下一个视图,但它会在转到正确的视图后显示 "incorrect" 弹出视图。

我知道这听起来很复杂,但它目前是一个超级简单的应用程序。我怀疑我只是做错了。值得注意的是,我还收到一个可能相关的错误 "Presenting view controllers on detached view controllers is discouraged"。

非常感谢任何人可以提供的任何帮助。 D.

听起来你有一个或两个 segues 直接连接到故事板中的按钮,即使你没有在代码中调用 performSegueWithIdentifier(_:),这也会在按下按钮时自动触发 segues .然后,您将设置一个 IBAction 方法,该方法在按下按钮时被 调用,然后您以编程方式再次执行 segue .

您可以转到故事板并 select 按下按钮来检查这一点。转到右侧的连接检查器,我希望您会看到一个 Triggered Segues 部分,其中 "action" 触发您的 "show" segue。您可以通过单击连接旁边的叉号来删除它。

对于应该以编程方式启动的转场,您应该通过从视图控制器对象(而不是从控件/可操作元素)拖动到下一个视图控制器来创建转场。这将创建一个仅由代码中的 performSegueWithIdentifier(_:) 触发的通用 segue。

正如您所注意到的,由于您的 segue 是针对弹出窗口演示文稿的,因此除非它明确锚定到故事板中的特定视图,否则它会报错。您仍然可以将 segue 从 view controller 对象拖到 popover view controller,但是您必须手动挂钩锚点:select storyboard 中的 segue,选择右边的 attributes inspector,从圆圈中拖出在 "Anchor" 字段中添加到您要锚定的文本字段。