为啥界面生成器不显示我的展开转场?
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 重新启动会使操作出现。
【讨论】:
以上是关于为啥界面生成器不显示我的展开转场?的主要内容,如果未能解决你的问题,请参考以下文章