Swift:关闭所有视图控制器,然后呈现一个视图控制器

Posted

技术标签:

【中文标题】Swift:关闭所有视图控制器,然后呈现一个视图控制器【英文标题】:Swift: Dismissing all view controllers and then presenting a view controller 【发布时间】:2021-04-16 18:28:37 【问题描述】:

我正在寻找一种方法来关闭所有呈现的视图控制器,然后呈现一个视图控制器。

在我的应用程序中,有一个主页,然后用户可以单击一个按钮将他们带到另一个页面,然后他们可以单击一个按钮来提交一些信息。在他们点击提交证据后,我想关闭所有视图控制器(以便他们进入主页),然后我想呈现一个“恭喜”屏幕。理想情况下,这就是我想要做的:

self.view.window?.rootViewController?.dismiss(animated: true, completion: 
        let congratsPopup = K.mainStoryBoard.instantiateViewController(withIdentifier: "congratsController") as! CongratsController
        self.view.window?.rootViewController!.present(congratsPopup, animated:true, completion:nil)
    )

有什么想法吗?

干杯, 乔什

【问题讨论】:

【参考方案1】:

您可以使用以下代码块关闭所有视图控制器。在完成块中,您可以获得 topViewController,并且可以在 topViewController 上呈现新的 viewController。我还写了一个扩展来获取窗口上的topViewController。

UIApplication.shared.keyWindow?.rootViewController?.dismiss(animated: true, completion:  [weak self] in
            // Get Top Controller With Extension
            let topController = UIApplication.topViewController()
            // Pressent New Controller over top controller
            let congratsPopup = K.mainStoryBoard.instantiateViewController(withIdentifier: "congratsController") as! CongratsController
            topController?.present(congratsPopup, animated: true, completion: nil)
        )

获取顶部视图控制器扩展

extension UIApplication 
class func topViewController(controller: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? 
    if let navigationController = controller as? UINavigationController 
        return topViewController(controller: navigationController.visibleViewController)
    
    if let tabController = controller as? UITabBarController 
        if let selected = tabController.selectedViewController 
            return topViewController(controller: selected)
        
    
    if let presented = controller?.presentedViewController 
        return topViewController(controller: presented)
    
    return controller


【讨论】:

感谢 Alihan - 这非常有效!非常感谢:) 刚刚实现这个,当我回到第一个 ViewController 时出现错误。我正在尝试在 ViewController 中重新加载 TableView,但它给了我一个“展开 tableview 时意外的 nil”。有任何想法吗?再次感谢!

以上是关于Swift:关闭所有视图控制器,然后呈现一个视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

Swift:关闭 viewController 1 然后呈现 viewController 2

导航栏在 iPhone XS Max swift 上关闭视图控制器上的视图

隐藏呈现的视图导致所有视图隐藏 Swift

如何关闭模态视图控制器,然后立即让呈现视图控制器呈现不同的模态视图控制器?

如何一次关闭 3 个模态视图控制器?

关闭当前的模态视图控制器,然后呈现新的模态视图控制器