为什么界面构建器没有显示我的展开segue?

时间:2016-10-30 01:49:56

标签: ios swift xcode interface-builder

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

UINavigationController - MasterViewController> DetailViewController> InfoViewController

MasterViewController包含以下方法:

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

在DetailViewController中,有一个类似的方法:

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

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

我已经咨询了多个在线资源(Ray Wenderlich,相关的StackOverflow问题),指导在界面构建器中生成展开segue的正确方法,但这些都没有帮助解决问题。现在,我首先需要帮助搞清楚问题是什么。随着发展的进行,它可能会让我看起来像是方形的东西。

Exit Menu in DetailViewController — 'unwindToPersonWith:' = 'unwindToDetail'

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

6 个答案:

答案 0 :(得分:9)

重新迭代:不仅要将故事板Unwind Segue的Action放在与class定义相同的源文件中,还要放置到(目标)View Controller(例如@IBAction func prepareForUnwind(segue: UIStoryboardSegue) },在"呈现分段"列表中检测为prepareForUnwind[With]Segue,但视图控制器在任何辅助源文件中都不能包含任何扩展名。您必须将class定义和所有扩展合并到一个源文件中。

(从Xcode 8.2.1开始。)

答案 1 :(得分:4)

就我而言,我的视图控制器中有一个复杂的继承,这就是Interface Builder没有看到我放松的原因。所以这个解决方法对我很有用:

  1. 转到YouCollViewController.swift文件并删除视图控制器在视图控制器声明中实现的所有类,协议,泛型等
  2. UIViewController
  3. 继承您的视图控制器
  4. 转到故事板并将您的操作与unwind联系起来,它应显示在展开列表中
  5. 返回YouCollViewController.swift文件并放弃所有更改

答案 2 :(得分: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的所有扩展都必须存在在同一个文件中,以便界面构建器找到并识别展开segue。

现在,在故事板中,退出菜单显示两个展开的细分。我的结论是,通过摆弄方法的位置以及如何声明它们,可以找到界面构建器可以识别的配置。我希望将来不那么敏感,因为我目前的方法组织很长很难以导航。

enter image description here

答案 3 :(得分:0)

因为这些答案都没有帮助我,而且我也不想把我的代码弄得那么多。在这里你可以尝试另一种解决方案。

从已经将展开功能添加到MasterViewController的那一刻开始。

  1. 首先,我继续向我的故事板添加一个新的ViewController,以及一个类型为UIViewController的新Cocoa Touch类文件,并将其与我的Storyboard连接(我称之为HelperViewController)。

  2. 然后你可以添加相同的展开功能,你已经将MasterVC内部添加到新创建的HelperVC中。

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

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

  4. 我希望有所帮助!

    My Storyboard

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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