【问题标题】:How to pop back to a view in a different navigation controller?如何在不同的导航控制器中弹回视图?
【发布时间】:2016-07-31 07:17:26
【问题描述】:

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

  1. 用户点击按钮
  2. 一个模态视图弹出一个选项。用户选择一个选项。
  3. 第二个视图出现另一个选项(使用“显示”过渡,因此用户可以按 更改选项 #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 没有发生。第二个模态视图保留在屏幕上,但我打印了“尝试转场”消息。

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

【问题讨论】:

  • 在您的导航控制器中有一个名为 viewControllers 的属性,其中包含您已导航的所有控制器,删除您想要跳过的那些

标签: ios swift unwind-segue


【解决方案1】:

如果您使用情节提要,则可以使用展开转场来做到这一点。

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

@IBAction func unwindToVC1(sender: UIStoryboardSegue) {

}

然后从 VC3 的 Prototype 单元格中按住 control 并拖动到视图控制器的 Exit 图标,选择 Selection Segue: unwindToVC1: 即可。

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

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

【讨论】:

  • 感谢 Viktor,我按照您在 VC3 中的建议使用了 dismissViewControllerAnimated,它完成了这项工作。
猜你喜欢
  • 2020-10-04
  • 1970-01-01
  • 1970-01-01
  • 2014-12-09
  • 1970-01-01
  • 2023-03-24
  • 2019-06-29
  • 2020-05-27
  • 2015-04-30
相关资源
最近更新 更多