Ios 展开多个导航控制器

Ios 展开多个导航控制器,ios,swift,uinavigationcontroller,unwind-segue,Ios,Swift,Uinavigationcontroller,Unwind Segue,假设我在导航控制器中嵌入了视图控制器A、B和C。在C中,我为一个单独的逻辑流提供了一个新的导航控制器,但需要在完成后返回到a。因此,应用程序流程如下:A->B->C--以模式呈现新的导航控制器--D->E->F。然后从F返回到A 我已经设置了一个展开序列,但是,展开序列只会将我带回D,即使我已经将其设置为返回A 我怎样才能让它一路放松回到一个新的世界?我是否错过了一些我看不到的东西?多谢各位 内部A: @IBAction func unwindToHome(segue:UIStorybo

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

我已经设置了一个展开序列,但是,展开序列只会将我带回D,即使我已经将其设置为返回A

我怎样才能让它一路放松回到一个新的世界?我是否错过了一些我看不到的东西?多谢各位

内部A:

    @IBAction func unwindToHome(segue:UIStoryboardSegue){}
然后,我将控件从F拖到它的“出口”,并选择我在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的唯一方法。我想知道,例如,D是否有自己的
unwindtoom
操作(或者可能是与A相同类型的另一个实例)。归根结底,我无法复制你描述的行为,除非通过类似的方式

你后来问:

我在上述所有视图控制器中都使用了
deinit
方法。我只在他们所有人身上印上“消失”这个词。当它重新展开到一个位置时,“消失”只打印两次。“展开”序列不是取消分配所有实例吗


是的,它们都应该被解除分配。如果不是,则“调试内存图”(请参阅)非常适合显示哪些内容保留了对未释放的内存的强引用。最有可能的是,这些未解除分配的视图控制器有一些挥之不去的强引用周期、重复的计时器引用,或者类似的东西,分别对每个视图控制器保持一个强引用。

什么是D、E、F?事实上,您得到了@Rob!因为某种原因,我在D中也有它…附带问题。。我在上面所有的视图控制器中都使用了deinit方法。我只在他们所有人身上印上“消失”这个词。当它重新展开到一个位置时,“消失”只打印两次。“释放”段不是释放所有实例吗?@Rob再次感谢,现在正在处理强引用。如果这对你很重要,我可以接受你的回答,如果你发布一个