所以我有3个视图控制器:TableViewController,A和B.用户可以从任何视图控制器导航到任何视图控制器。
当用户在A和B视图控制器之间来回走动时,我希望将它们推到导航器上。堆。当"家庭"按下按钮,我想让视图控制器全部使用popToViewController弹出回TableViewController,而不是popToRootViewController(原因)。
我有部分工作代码弹出最后一个访问过的视图控制器,但现在是所有这些代码。
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
if indexPath.row == 0 {
if let navController = self.navigationController {
for controller in navController.viewControllers {
if controller is TableViewController {
navController.popToViewController(controller, animated: true)
break
}
}
}
} else {
let vcName = identities[indexPath.row]
let viewController = storyboard?.instantiateViewController(withIdentifier: vcName)
self.navigationController?.pushViewController(viewController!, animated: true)
}
}
我不确定为什么所有视图控制器都没有被弹出。
代码我用来检查被推送和弹出的内容:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(true)
if self.isMovingToParentViewController {
print("A is pushed")
}
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(true)
if self.isMovingFromParentViewController {
print("A is popped")
}
}
我也检查内存增加。
我将在需要时提供更多代码/信息。
非常感谢任何帮助。
答案 0 :(得分:1)
您的困惑可能只是您尝试的方式"检查" VC已经弹出"弹出"。
假设你已经离开了:
root->TableView->A->B->A->B->B->B->`
此时,唯一可见的VC
是A
的最后一个实例。所以当你打电话时
navController.popToViewController(controller, animated: true)
viewWillDisappear()
仅在A
的最后一个实例上调用 - 其他任何VC
个实例都不会消失"因为它们不可见。
如果要确认堆栈中的其他VC正在被删除",请将其放在每个视图控制器中:
deinit() {
print("I'm being removed:", self)
}
问题的另一部分 - 您是否希望通过流程制作动画?所以你实际上会看到VC"走回堆栈"?如果是这样,请关注@ FryAnEgg的Completion block for popViewController
链接答案 1 :(得分:0)
尝试这样的事情:
var theControllerIWantToPopTo = controllerB // or whatever other condition
if let navController = self.navigationController {
for controller in navController.viewControllers {
if controller is TableViewController {
if controller == theControllerIWantToPopTo {
navController.popToViewController(controller, animated: true)
break
}
}
}
}
请记住,popToViewController将弹出所有控制器,直到所选控制器位于顶部,而popViewController只会弹出顶部控制器。如果您想逐个弹出一个动画,请在每个弹出窗口中看到:Completion block for popViewController