展开多个导航控制器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了展开多个导航控制器相关的知识,希望对你有一定的参考价值。

假设我有控制器A,B和C嵌入在导航控制器中。从C开始,我为一个单独的逻辑流程提供了一个新的导航控制器,但需要在完成时返回到A.因此,应用程序流程如下:A-> B-> C - 以模式方式呈现新的导航控制器 - D-> E-> F.然后从F回到A.

我已经设置了一个展开segue,但是,展开segue只会让我回到D,即使我已经设置它返回到A.

我怎样才能让它一直放松回A?我错过了一些我看不到的东西吗?谢谢。

里面A:

    @IBAction func unwindToHome(segue:UIStoryboardSegue){}

然后我控制 - 从F拖到它的'exit'并选择我在A中创建的展开segue,并编写了这个segue代码:

    private let SEGUE_TO_HOME = "unwindToHome"
    performSegue(withIdentifier: SEGUE_TO_HOME, sender: nil)
答案

当您放松时,它应该通过所有这些导航控制器和模态演示文件返回视图控制器链,以一直到实现此展开操作的视图控制器。

unwindToHome是否可能出现在A以外的任何视图控制器中?这是我唯一可以看到展开动作不会一直回到A的方式。我想知道,例如,D是否有自己的unwindToHome动作(或者可能是另一个与A相同类型的实例) )。最重要的是,除了通过类似的东西,我无法再现你描述的行为。

你随后问:

我在所有上面的视图控制器中都放了一个deinit方法。我只打印所有这些中的单词。当它退回到A时,'消失'仅打印两次。 unwind segue不会解除所有实例的释放吗?

是的,他们都应该被解除分配。如果没有,“调试内存图”debug memory graph button(参见https://stackoverflow.com/a/30993476/1271826)非常出色地展示了对未解除分配的内容的强引用。最有可能的是,这些未解除分配的视图控制器具有一些挥之不去的强引用周期,重复定时器引用,或类似地分别保持对每个引用的强引用。

另一答案

您可以通过为第二个导航控制器创建子类来创建对控制器A-C嵌入的第一个导航控制器的引用。

class SecondNavController: UINavigationController {

  // getter for previous nav controller
  var prevNavController: UINavigationController? {
    return parent?.navigationController
  }

}

当你需要放松时,只需:

class FController: UIViewController {

  // other code

  func unwindToRootController() {
    guard let navController = navigationController as? SecondNavController,
      let prevNavController = navController.prevNavController else {
      return
    }
    navigationController.popToRootViewController(animated: true)
  }

}

以上是关于展开多个导航控制器的主要内容,如果未能解决你的问题,请参考以下文章

在多个故事板环境中展开 segue

如何在多个 .xib 文件之间执行展开转场(不使用情节提要)

使用导航控制器按下后退按钮后如何防止前一个片段显示?

使用导航控制器按下后退按钮后,如何防止先前的片段出现?

在导航控制器上添加片段而不是替换片段?

导航上的片段生命周期重叠