为啥界面生成器不显示我的展开转场?

Posted

技术标签:

【中文标题】为啥界面生成器不显示我的展开转场?【英文标题】:Why is interface builder not showing my unwind segue?为什么界面生成器不显示我的展开转场? 【发布时间】:2016-10-30 01:49:56 【问题描述】:

我的应用的导航流程有点像这样:

UINavigationController - MasterViewController > DetailViewController > InfoViewController

MasterViewController 包含以下方法:

@IBAction func unwindToMaster(with segue: UIStoryboardSegue) 

在DetailViewController中,也有类似的方法:

@IBAction func unwindToDetail(with segue: UIStoryboardSegue) 

我使用这些方法以及 UIButtons 来允许用户在导航层次结构中前进和后退。在界面生成器中,当我在 InfoViewController 中右键单击“退出”时,我看到了 DetailViewController 下的方法,但是当我在 DetailViewController 中右键单击“退出”时,没有列出其他展开 segues。

我咨询了多个在线资源(Ray Wenderlich,相关 *** 问题),指导了在界面构建器中生成展开转场的正确方法,但这些都没有帮助解决问题。现在,我首先需要帮助找出问题是什么。通常情况下,这可能是一些让我眼前一亮的东西。

我正在使用 Swift 3 运行 Xcode 8.1。谢谢。

【问题讨论】:

我发现有时 Xcode 需要进行几次重建才能找到所有相关的展开转场。如果您清理、重建然后重新打开情节提要,这是否有帮助? 我建议删除“with”这个词并用下划线替换它(_)。这就是这里所期望的。 我尝试了几次你的建议,@ChrisVig,但它并没有改变故事板中的任何内容。过去,您必须重建多少次才能让界面生成器赶上? 感谢@matt 的建议,但将with 替换为_ 并没有导致第一个方法出现在界面生成器中。 @blutie 通常只有一两次,所以听起来这可能是一个不同的问题。 【参考方案1】:

要重新迭代:不仅 Storyboard Unwind Segue 的 Action 必须与 class 定义的展开到(目标)视图控制器(例如,@IBAction func prepareForUnwind(segue: UIStoryboardSegue),检测为prepareForUnwind[With]Segue 在“Presenting Segues”列表中),而且 View Controller 不能在任何辅助源文件中具有任何扩展名。您必须将 class 定义和所有扩展名合并到一个源文件中。

(从 Xcode 8.2.1 开始。)

【讨论】:

【参考方案2】:

在我的例子中,我的视图控制器中有一个复杂的继承,这也是 Interface Builder 没有看到我展开的原因。所以这个解决方法对我很有效:

    转到YouCollViewController.swift 文件并删除视图控制器在视图控制器声明中实现的所有类、协议、泛型等 从UIViewController继承你的视图控制器 转到故事板并将您的操作与unwind 连接起来,它应该出现在展开列表中 返回YouCollViewController.swift文件并放弃所有更改

【讨论】:

这在 XCode 11 中对我有用。我必须将目标视图控制器更改为从 UIViewController 继承,然后展开转场出现在 Exit 中【参考方案3】:

我查阅了 Apple 的开发者库(特别是页面 "Using Unwind Segues")。在那里,展开动作的示例定义是:

@IBAction func unwindToMainMenu(sender: UIStoryboardSegue) 
    let sourceViewController = sender.sourceViewController
    // Pull any data from the view controller which initiated the unwind segue.

在我的代码中应用此示例,我将展开操作声明更改为:

@IBAction func unwindToMaster(sender: UIStoryboardSegue) 
    print("Unwinded to master.")

@IBAction func unwindToDetail(sender: UIStoryboardSegue) 
    print("Unwinded to detail.")

我还确保每个方法都包含在与 MasterViewController 的类声明相同的文件中。经过进一步测试,我发现 MasterViewController 的所有扩展都必须存在在同一个文件中,以便界面生成器找到并识别展开转场。

现在,在情节提要中,退出菜单显示两个展开转场。我的结论是,通过摆弄方法的放置位置和声明方式,将找到接口构建器可以识别的配置。我希望它在未来不会那么棘手,因为我目前的方法组织很长而且很难导航。

【讨论】:

我遇到了同样的问题——我的方法签名是正确的,但我在另一个文件中有扩展名。将其移回同一个文件即可修复它。【参考方案4】:

因为这些答案都对我没有帮助,而且我不想过多地弄乱我的代码。您可以在这里尝试另一种解决方案。

从您已经将展开功能添加到 MasterViewController 的位置开始。

    首先,我在我的故事板中添加了一个新的 ViewController 以及一个新的 UIViewController 类型的 Cocoa Touch 类文件,并将它与我的故事板连接起来(我称之为 HelperViewController)。

    然后您可以将 MasterVC 中已有的相同展开函数添加到新创建的 HelperVC。 @IBAction func unwindToMaster(with segue: UIStoryboardSegue)

    现在将 Helper 连接到您的 DetailVC。你的故事板应该看起来有点像我的。如果您 ctrl + 拖放到 DetailVC 的出口,您应该得到与我相同的选项。当连接建立并且您将鼠标悬停在新创建的 segue 上时,Master 和 HelperVC 都应该被突出显示。现在您可以再次删除 HelperVC,一切都会按预期进行。

希望对你有所帮助!

【讨论】:

【参考方案5】:

使用 swift 4 XCode 9.2 我发现您需要将引用从 viewController 顶部的黄色图标拖到左侧详细信息面板中目标 viewController 的“Exit”引用。希望这会有所帮助!

【讨论】:

【参考方案6】:

有时 XCode 重新启动会使操作出现。

【讨论】:

以上是关于为啥界面生成器不显示我的展开转场?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不显示中间视图的情况下通过多个视图展开

为啥我的EVE进入登录界面 启动的LOGO完了以后 就没反映了进程显示在运行 任务显示无响应

禁用转场动画

xcode为啥启动界面不显示

为啥我的 TScrollBox 不显示滚动条?

UISplitViewController:为啥我不应该在导航或标签栏界面中显示它?