展开多个导航控制器

Unwind multiple navigation controllers

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

我已经设置了一个 unwind segue,但是,unwind segue 只带我回到 D,即使我已经将它设置为 return 回到 A。

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

A内:

    @IBAction func unwindToHome(segue:UIStoryboardSegue){}

然后我从 F 控制拖动到它的 'exit' 并选择我在 A 中创建的展开转场,并写下这个转场代码:

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

您可以通过为第二个导航控制器创建子类来简单地创建对嵌入控制器 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)
  }

}

当你展开时,它应该返回视图控制器链,通过所有这些导航控制器和模式呈现,一直到实现了这个展开操作的视图控制器。

是否有可能 unwindToHome 出现在除 A 之外的任何视图控制器中?这是我能看到展开操作不会将您一路送回 A 的唯一方法。我想知道,例如,D 是否有自己的 unwindToHome 操作(或者也许是另一个实例与 A) 相同的类型。最重要的是,除非通过类似的方式,否则我无法重现您描述的行为。

您随后问:

I have put a deinit method in all of the above view controllers. I only print the word gone in all of them. when it unwinds back to A, 'gone' is only printed twice. Doesn't the unwind segue deallocate all instances?

是的,它们都应该被释放。如果不是,“调试内存图” (see ) 非常擅长显示对未释放内存保持强引用的内容。最有可能的是,这些未释放的视图控制器有一些挥之不去的强引用循环、重复计时器引用,或类似的东西分别保持对每个视图控制器的强引用。