popToViewController不会弹出所有视图控制器

时间:2017-07-05 19:02:17

标签: ios swift uinavigationcontroller poptoviewcontroller

所以我有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")
    }
}

我也检查内存增加。

我将在需要时提供更多代码/信息。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

您的困惑可能只是您尝试的方式"检查" VC已经弹出"弹出"。

假设你已经离开了:

root->TableView->A->B->A->B->B->B->`

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

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