在我的应用程序中,我有三个表视图控制器,然后可能有许多UIViewControllers,如果用户在任何时候按下,则每个UIViewControllers都必须返回到第一个表视图控制器。我不希望用户必须回溯可能数百页。这是我有趣的,以确定用户是否按下后退按钮,它的工作原理是打印消息
override func viewWillDisappear(_ animated: Bool) {
if !movingForward {
print("moving back")
let startvc = self.storyboard!.instantiateViewController(withIdentifier: "FirstTableViewController")
_ = self.navigationController!.popToViewController(startvc, animated: true)
}
}
我已经搜索过,到目前为止还没有任何解决方案。
答案 0 :(得分:12)
popToViewController
无法按照您尝试的方式工作,而是传递FirstTableViewController
的完整新引用,而不是导航堆栈中的引用。因此,您需要遍历navigationController?.viewControllers
并找到FirstTableViewController
,然后使用popToViewController
的实例调用FirstTableViewController
。
for vc in (self.navigationController?.viewControllers ?? []) {
if vc is FirstTableViewController {
_ = self.navigationController?.popToViewController(vc, animated: true)
break
}
}
如果您要转到首屏,那么您可能正在寻找popToRootViewController
而不是popToViewController
。
_ = self.navigationController?.popToRootViewController(animated: true)
答案 1 :(得分:1)
试试这个:
$a
答案 2 :(得分:0)
如果您在回调中,尤其是在异步网络回调中,则可能不在主线程上。如果那是您的问题,解决方案是:
DispatchQueue.main.async {
self.navigationController?.popToViewController(startvc, animated: true)
}
总是在主线程上调用系统调用viewWillDisappear()
。