我有一个表视图,只要有人按下单元格,视图控制器就会弹出。这是我的tableView(_tableView:UITableView,didSelectRowAt indexPath:indexPath(方法的代码:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
//previously written code
navigationController?.popViewController(animated: true)
}
除了一种情况外,一切都很好:视图一加载,我就尝试立即按下任何单元格。在这种情况下,没有执行popViewController,我得到了以下错误:
popViewControllerAnimated:在发生现有转换或演示时在UINavigationController上调用;导航堆栈将不会被更新。
我知道,这个问题以前出现在StackOverflow上,但我没有找到任何其他解决方案,除了:
DispatchQueue.main.asyncAfter(deadline: .now() + //time) {
navigationController?.popViewController(animated: true)
}
它工作得很好,但按下表视图单元格时不需要延迟。演示结束后,popViewController即可按要求工作,不需要延迟执行。
有其他方法可以做到这一点吗?或者在过渡准备好后以某种方式收到通知,这样我就可以在之后弹出?
您可以使用UIViewController
的transitionCoordinator
。
其文件显示:
当演示或解雇正在进行时,此方法返回与该转换关联的转换协调器对象。如果没有与当前视图控制器关联的正在进行的转换,UIKit会检查视图控制器的祖先是否存在转换协调器对象,并返回该对象(如果存在(。可以使用此对象创建其他动画,并将它们与过渡动画同步。
let completion = {
navigationController?.popViewController(animated: true)
}
guard let coordinator = transitionCoordinator else {
completion()
return
}
coordinator.animate(alongsideTransition: nil) { _ in
completion()
}