展开多个导航控制器
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不会解除所有实例的释放吗?
是的,他们都应该被解除分配。如果没有,“调试内存图”(参见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)
}
}
以上是关于展开多个导航控制器的主要内容,如果未能解决你的问题,请参考以下文章