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->`

此时,唯一可见的 VCA 的最后一个实例。所以当你打电话给

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