如何弹出回到不同导航控制器中的视图?

How to pop back to a view in a different navigation controller?

我想在我的 Swift 应用程序中创建以下用户流:

  1. 用户点击按钮
  2. 弹出一个带有选项的模态视图。用户选择一个选项。
  3. 出现带有另一个选项的第二个视图(使用 "show" 转换,因此用户可以按 < 返回 更改选项 #1)。用户选择第二个选项。
  4. 第二个模态视图返回到原始视图(具有按钮)。

为此,我创建了以下结构:

--> NC1 --> VC1 --modal-> NC2 --> VC2 --show-> VC3    (NC = UINavigationController,
             ^                                  |      VC = UIViewController)
             |                                  |
             ----Segue I'm trying to achieve-----

我尝试通过将对 VC1 的引用一直传递到 VC3,然后在 VC3 中调用以下代码,来一直返回到 VC1:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    // Perform Segue
    print("Trying to segue")
    rootController!.navigationController!.popToRootViewControllerAnimated(true)

    tableView.deselectRowAtIndexPath(indexPath, animated: true)
} 

其中 rootController 是对 VC1 的引用。不幸的是,segue 没有发生;第二个模态视图保留在屏幕上,但我打印了 "Trying to segue" 消息。

我是否尝试以正确的方式实施此用户流程?如果是这样,为什么我不能弹出到另一个导航控制器中的根视图有什么建议吗?

如果您正在使用故事板,则可以使用展开转场来执行此操作。

在 VC1 中实现一个 @IBAction 方法,它以一个 UIStoryboardSegue 作为参数:

@IBAction func unwindToVC1(sender: UIStoryboardSegue) {

}

然后从 VC3 的 Prototype 单元格中按住 control 拖动到视图控制器的 Exit 图标,select Selection Segue: unwindToVC1: 就可以了。

您也可以使用代码实现类似的结果。
像这样在 VC3 中实现 didSelectRowAtIndexPath

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    navigationController!.dismissViewControllerAnimated(true, completion: nil)
}