如果以模态方式呈现,则获取最顶层的 UIViewController

Posted

技术标签:

【中文标题】如果以模态方式呈现,则获取最顶层的 UIViewController【英文标题】:Get top most UIViewController if its presented modally 【发布时间】:2021-03-09 09:40:29 【问题描述】:

我已经使用vc.modalPresentationStyle = .fullScreen 模态展示了一个 ViewController

但是当我尝试使用下面的代码获取最顶层的视图控制器时,它返回 nil。

func getTopViewController() -> UIViewController? 
    var topController: UIViewController? = UIApplication.shared.keyWindow?.rootViewController
    while topController?.presentedViewController != nil 
        topController = topController?.presentedViewController
    
    return topController

如果我使用 vc.modalPresentationStyle = .fullScreen 呈现它,这里 topController?.presentedViewController 返回 nil,如果我使用默认呈现样式,它工作正常。

有人遇到过同样的问题吗,不胜感激。

【问题讨论】:

UIApplication.shared.keyWindow?.rootViewController 它返回 nil 吗? 没有。 topController?.presentedViewController 返回 nil,即使显示了 vc 该功能将不起作用(可靠) - 因为模态呈现的视图控制器可以由 vc 链中的任何其他视图控制器呈现。因此,您的 rootViewController 的 presentedViewController 可以为 nil,而实际上链中有一个视图控制器正在呈现另一个(不一定是您所追求的)。 但是如果我改变了演示风格,那么它就可以正常工作了 @christijk 你在用UITabBarController吗? 【参考方案1】:

我已经创建了这个扩展来获取最顶层的控制器

   extension UIViewController 
    var topMostViewController : UIViewController 
        
        if let presented = self.presentedViewController 
            return presented.topMostViewController
        
        
        if let navigation = self as? UINavigationController 
            return navigation.visibleViewController?.topMostViewController ?? navigation
        
        
        if let tab = self as? UITabBarController 
            return tab.selectedViewController?.topMostViewController ?? tab
        
        return self
    


extension UIApplication 
    var topMostViewController : UIViewController? 
        return self.keyWindow?.rootViewController?.topMostViewController
    

希望这对你有用

【讨论】:

以上是关于如果以模态方式呈现,则获取最顶层的 UIViewController的主要内容,如果未能解决你的问题,请参考以下文章

视图控制器以模态方式呈现/关闭时的通知?

带有呈现的 UIAlertController 的 UINavigationController 被另外解雇

来自应用委托的 presentModalViewController

嵌入到导航控制器中的动画根视图控制器以模态方式呈现

以模态方式呈现的 UIPopoverController 在 iOS 5 中不起作用

addSubview与呈现模式ViewController之间的区别?