如何关闭视图控制器并快速弹出到根视图控制器?
Posted
技术标签:
【中文标题】如何关闭视图控制器并快速弹出到根视图控制器?【英文标题】:How to dismiss viewcontroller and pop to root viewcontroller swift? 【发布时间】:2020-10-21 16:48:57 【问题描述】:我有包含 ViewController(A) 的主 TabbarController。 从此 A 使用 navigationController?.pushViewController 推送另一个 ViewController(B) 从 B 使用 navigationController?.pushViewController 推送另一个 ViewController(C) 从 C 模态地呈现另一个 ViewController(D)。 从 D 使用 taps button 时,它应该关闭 D 和 popToRootViewController 。
我搜索了类似的问题,但还没有找到解决方案。
我该怎么做?
【问题讨论】:
你的问题和***.com/questions/47322379/…很相似 【参考方案1】:创建协议
protocol YourDelegate: class
func didDismiss()
在 ViewController D 中,创建对协议的弱引用
weak var delegate: YourDelegate?
在ViewController C中,符合协议和函数中的popToRootVC
extension ViewControllerC: YourDelegate
func didDismiss()
self.navigationController?.popToRootViewController()
同样在 ViewController C 中,将 ViewControllerD 的委托设置为你展示 VC 的地方
//example:
let vcD = ViewControllerD()
vcD.delegate = self
self.navigationController.pushViewController(vcD, animated: true)
最后,在 ViewController D 中,在你的关闭函数闭包中,调用委托函数
self.dismiss(animated: true)
self.delegate?.didDismiss()
【讨论】:
是的,它有效。谢谢。但是当 ViewController D 关闭时,它首先显示 ViewController C,然后弹出到根视图控制器。是否可以在 ViewController D 关闭时直接弹出到 rootviewController 而不进行任何转换? 否,但您可以禁用过渡动画:self.dismiss(animated: false) 实际上,也许您可以尝试在关闭之前而不是在闭包中调用委托函数,也许这会给它带来所需的行为: self.delegate?.didDismiss() self.dismiss(动画:真/假) 是的,我认为它看起来更好。谢谢。委托是实现这一点的最佳方式吗? 是的,协议通常是视图控制器之间通信的首选方式。以上是关于如何关闭视图控制器并快速弹出到根视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章