【问题标题】: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,相关 StackOverflow 问题),指导了在界面构建器中生成展开转场的正确方法,但这些都没有帮助解决问题。现在,我首先需要帮助找出问题是什么。通常情况下,这可能是一些让我眼前一亮的东西。

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

【问题讨论】:

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

标签: ios swift xcode interface-builder


【解决方案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 没有看到我展开的原因。所以这个解决方法对我很有效:

    1. 转到YouCollViewController.swift 文件并删除视图控制器在视图控制器声明中实现的所有类、协议、泛型等
    2. UIViewController继承你的视图控制器
    3. 转到故事板并将您的操作与unwind 连接起来,它应该出现在展开列表中
    4. 返回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 的位置开始。

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

    2. 然后您可以将 MasterVC 中已有的相同展开函数添加到新创建的 HelperVC。

      @IBAction func unwindToMaster(with segue: UIStoryboardSegue) {}

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

    希望对你有所帮助!

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-30
          • 2015-12-22
          • 1970-01-01
          • 1970-01-01
          • 2015-06-24
          • 2021-06-19
          相关资源
          最近更新 更多