展开多个导航控制器

时间:2018-01-01 01:56:32

标签: ios swift uinavigationcontroller unwind-segue

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

我已经设置了一个展开segue,然而,即使我已将其设置为返回A,展开segue也只会将我带回D.

如何让它一直放松回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)

2 个答案:

答案 0 :(得分:1)

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

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

您随后问:

  

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

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

答案 1 :(得分:0)

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

}