0

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

我也在检查内存的增加。

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

任何帮助将不胜感激。

4

2 回答 2

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)
}

问题的另一部分 - 你想通过这个过程制作动画吗?所以你真的会看到风投“走回堆栈”吗?如果是这样,请按照@FryAnEgg 的链接指向 popViewController 的Completion 块

于 2017-07-05T21:30:53.517 回答
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 只会弹出顶部控制器。如果您想一次弹出一个并在每个弹出窗口上播放动画,请参阅:popViewController 的完成块

于 2017-07-05T20:31:07.870 回答