【问题标题】:Get top most UIViewController if its presented modally如果以模态方式呈现,则获取最顶层的 UIViewController
【发布时间】: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吗?

标签: ios swift


【解决方案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
    }
}

希望这对你有用

【讨论】:

    猜你喜欢
    • 2014-05-29
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    相关资源
    最近更新 更多