如果以模态方式呈现,则获取最顶层的 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