【问题标题】: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 。

我搜索了类似的问题,但还没有找到解决方案。

我该怎么做?

【问题讨论】:

标签: swift popviewcontroller dismissviewcontroller


【解决方案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(动画:真/假)
  • 是的,我认为它看起来更好。谢谢。委托是实现这一点的最佳方式吗?
  • 是的,协议通常是视图控制器之间通信的首选方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-08
  • 1970-01-01
  • 2014-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多