popToViewController 没有弹出所有的视图控制器
popToViewController isn't popping all of the view controllers
所以我有 3 个视图控制器:TableViewController、A 和 B。用户可以从任何视图控制器导航到任何视图控制器。
当用户在 A 和 B 视图控制器之间来回移动时,我希望将它们推到导航上。堆。当按下 "home" 按钮时,我希望所有视图控制器都使用 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")
}
}
我也在检查内存的增加。
我会提供更多code/info需要的。
如有任何帮助,我们将不胜感激。
尝试这样的事情:
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
您的困惑可能只是您试图 "check" 风险投资 "popped" 的方式。
假设你已经走了:
root->TableView->A->B->A->B->B->B->`
此时,唯一可见的 VC
是 A
的最后一个实例。所以当你打电话给
navController.popToViewController(controller, animated: true)
viewWillDisappear()
将 仅 在 A
的最后一个实例上调用 - none 的其他 VC
个实例将"disappear" 因为它们不可见。
如果您想确认堆栈中的其他 VC "removed",请将其放入每个视图控制器中:
deinit() {
print("I'm being removed:", self)
}
问题的另一部分 - 您想通过流程制作动画吗?所以你真的会看到 VC "walk back up the stack"?如果是这样,请按照@FryAnEgg 的 link 到 Completion block for popViewController
所以我有 3 个视图控制器:TableViewController、A 和 B。用户可以从任何视图控制器导航到任何视图控制器。
当用户在 A 和 B 视图控制器之间来回移动时,我希望将它们推到导航上。堆。当按下 "home" 按钮时,我希望所有视图控制器都使用 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")
}
}
我也在检查内存的增加。
我会提供更多code/info需要的。
如有任何帮助,我们将不胜感激。
尝试这样的事情:
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
您的困惑可能只是您试图 "check" 风险投资 "popped" 的方式。
假设你已经走了:
root->TableView->A->B->A->B->B->B->`
此时,唯一可见的 VC
是 A
的最后一个实例。所以当你打电话给
navController.popToViewController(controller, animated: true)
viewWillDisappear()
将 仅 在 A
的最后一个实例上调用 - none 的其他 VC
个实例将"disappear" 因为它们不可见。
如果您想确认堆栈中的其他 VC "removed",请将其放入每个视图控制器中:
deinit() {
print("I'm being removed:", self)
}
问题的另一部分 - 您想通过流程制作动画吗?所以你真的会看到 VC "walk back up the stack"?如果是这样,请按照@FryAnEgg 的 link 到 Completion block for popViewController