如何关闭视图控制器并快速弹出到根视图控制器?

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(动画:真/假) 是的,我认为它看起来更好。谢谢。委托是实现这一点的最佳方式吗? 是的,协议通常是视图控制器之间通信的首选方式。

以上是关于如何关闭视图控制器并快速弹出到根视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

iOS10 Facebook 登录弹出到根视图控制器

如何在弹出到根视图 Swift 后立即更改选项卡?

从模态弹出到根视图控制器

在导航控制器中弹出到根视图

弹出到根视图控制器,没有表视图的动画崩溃

弹出到根视图控制器时导航栏消失