说我有视图控制器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)
答案 0 :(得分:1)
当您放松时,它应该通过所有这些导航控制器和模态演示文件返回视图控制器链,以便一直到实现此展开操作的视图控制器。
除了A之外的任何一个视图控制器中是否可能出现unwindToHome
?这是我唯一可以看到展开动作不会一直发送回A的方式。我想知道,例如,D是否有自己的unwindToHome
动作(或者可能是与A相同类型的另一个实例)。最重要的是,我不能重现你描述的行为,除非通过类似的东西。
您随后问:
我在所有上述视图控制器中都放了一个
deinit
方法。我只打印所有这些中的单词。当它退回到A时,'消失了。只打印两次。 unwind segue是否解除了所有实例的释放?
是的,它们都应该被解除分配。如果没有,“调试内存图”(参见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)
}
}