【问题标题】:How to dismiss a viewController to rootViewController without showing any VCs in between dismiss process?如何在关闭过程之间不显示任何 VC 的情况下将 viewController 关闭到 rootViewController?
【发布时间】:2018-03-20 09:13:56
【问题描述】:

假设我有以下 VC:

RootVC --> VC A --> VC B

我正在使用 present 方法将视图控制器从 RootVC 呈现给 VC A,然后呈现给 VC B。现在我在 VC B 上,我想使用

从 VC B 解散回 RootVC
self.view.window!.rootViewController?.dismiss(animated: true, completion: nil)

它有效,但我仍然看到 VC A 在解雇过程中出现。然后,我试试这个方法

self.presentationController?.presentedViewController.dismiss(animated: true, completion: nil)

它也可以解散回根 VC,但我仍然看到 VC A 正在处理中。

我的问题是有没有办法在解雇过程中不显示 VC A?我已经尝试过动画:假但仍然得到相同的结果。谢谢!

【问题讨论】:

  • animated设置为false?
  • 如果你真的想要,绝对可以达到这个效果。在查看B 时,您显然不能在后台关闭A,因为A 正在呈现B。因此,您可以做的是专门为B 创建一个自定义关闭动画,它对根进行快照并从B 关闭到该快照——对用户来说,它看起来就像直接关闭到根。您也可以从A 推送到B 并对其进行动画处理,使其看起来像礼物;因此,关闭B 会将用户直接带到根目录。我个人不认为看到AB 之后自动关闭看起来很糟糕。

标签: ios swift


【解决方案1】:

您需要将modalPresentationStyle 更改为.custom。当当前可见控制器的视图是透明的时,custom 将允许您查看 presentingViewController 视图。

现在,当您想返回当前呈现堆栈的根视图时,您需要调用方法dismissToRootViewController(animated: completion:)

在此方法的实现中,将允许所有中间呈现视图控制器视图是透明的,这将使您从 VC cRootVC 关闭动画。

extension UIViewController {
    func dismissToRootViewController(animated: Bool, completion: (() -> Swift.Void)? = nil) {
        var viewController = self.presentingViewController
        while viewController?.presentingViewController != nil {
            viewController?.view.alpha = 0.0
            viewController = viewController?.presentingViewController
        }
        self.dismiss(animated: true) {
            viewController?.dismiss(animated: false, completion: completion)
        }
    }
}

【讨论】:

    【解决方案2】:

    你可以试试这个:

    navigationController?.popToRootViewController(animated: false)
    

    【讨论】:

    • 这是为了导航。我希望是否有解雇的方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    相关资源
    最近更新 更多