Swift 3: popToViewController 不工作

Swift 3: popToViewController not working

在我的应用程序中,我有三个 table 视图控制器,然后可能有许多 UIViewControllers,如果用户在任何时候按下返回键,每个 UIViewControllers 都必须返回到第一个 table 视图控制器。我不希望用户必须返回可能有数百页。这就是我用来确定用户是否按下了后退按钮并且它可以打印消息的有趣方法

override func viewWillDisappear(_ animated: Bool) {
    if !movingForward {
        print("moving back")
        let startvc = self.storyboard!.instantiateViewController(withIdentifier: "FirstTableViewController")
        _ = self.navigationController!.popToViewController(startvc, animated: true)
    }
}

我已经搜索过并且 none 的解决方案目前有效。

popToViewController 无法以您正在尝试的方式工作 您传递的是 FirstTableViewController 的完整新引用,而不是导航堆栈中的引用。因此,您需要遍历 navigationController?.viewControllers 并找到 FirstTableViewController,然后使用 FirstTableViewController.

的实例调用 popToViewController
for vc in (self.navigationController?.viewControllers ?? []) {
    if vc is FirstTableViewController {
        _ = self.navigationController?.popToViewController(vc, animated: true)
        break
    }
}

如果您想移动到 First Screen,那么您可能正在寻找 popToRootViewController 而不是 popToViewController

_ = self.navigationController?.popToRootViewController(animated: true)

试试这个:

let allViewController: [UIViewController] = self.navigationController!.viewControllers as [UIViewController];

                        for aviewcontroller : UIViewController in allViewController
                        {
                            if aviewcontroller .isKindOfClass(YourDestinationViewControllerName)// change with your class
                            {
                             self.navigationController?.popToViewController(aviewcontroller, animated: true)
                            }
                        }

如果您在回调中,尤其是异步网络回调中,您可能不在主线程中。如果那是你的问题,解决方案是:

DispatchQueue.main.async {
    self.navigationController?.popToViewController(startvc, animated: true)
}

系统调用viewWillDisappear()总是在主线程上调用。