首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >获取最顶级的UIViewController

获取最顶级的UIViewController
EN

Stack Overflow用户
提问于 2014-10-31 11:14:00
回答 27查看 194.3K关注 0票数 228

如果不访问UINavigationController,我似乎无法获得最高级别的UIViewController。这是我到目前为止所知道的:

代码语言:javascript
复制
UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(vc, animated: true, completion: nil)

然而,它似乎什么也做不了。keyWindowrootViewController似乎也是非空值,所以可选的链接应该不是问题。

注意:做这样的事情不是个好主意。它打破了MVC模式。

EN

回答 27

Stack Overflow用户

回答已采纳

发布于 2014-10-31 11:29:15

presentViewController显示了一个视图控制器。它不返回视图控制器。如果您没有使用UINavigationController,那么您可能正在寻找presentedViewController,并且需要从根开始并向下迭代所显示的视图。

代码语言:javascript
复制
if var topController = UIApplication.sharedApplication().keyWindow?.rootViewController {
    while let presentedViewController = topController.presentedViewController {
        topController = presentedViewController
    }

    // topController should now be your topmost view controller
}

对于Swift 3+:

代码语言:javascript
复制
if var topController = UIApplication.shared.keyWindow?.rootViewController {
    while let presentedViewController = topController.presentedViewController {
        topController = presentedViewController
    }

    // topController should now be your topmost view controller
}

对于iOS 13+

代码语言:javascript
复制
let keyWindow = UIApplication.shared.windows.filter {$0.isKeyWindow}.first

if var topController = keyWindow?.rootViewController {
    while let presentedViewController = topController.presentedViewController {
        topController = presentedViewController
    }

// topController should now be your topmost view controller
}
票数 354
EN

Stack Overflow用户

发布于 2015-06-16 12:06:34

具有此扩展名

Swift 2.*

代码语言:javascript
复制
extension UIApplication {
    class func topViewController(controller: UIViewController? = UIApplication.sharedApplication().keyWindow?.rootViewController) -> UIViewController? {
        if let navigationController = controller as? UINavigationController {
            return topViewController(navigationController.visibleViewController)
        }
        if let tabController = controller as? UITabBarController {
            if let selected = tabController.selectedViewController {
                return topViewController(selected)
            }
        }
        if let presented = controller?.presentedViewController {
            return topViewController(presented)
        }
        return controller
    }
}

Swift 3

代码语言:javascript
复制
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
    }
}

你可以在你的控制器上的任何地方使用它

代码语言:javascript
复制
if let topController = UIApplication.topViewController() {

}
票数 288
EN

Stack Overflow用户

发布于 2018-06-02 19:03:30

适用于swift 4/5+的,可获得最高的viewController

代码语言:javascript
复制
// MARK: UIApplication extensions

extension UIApplication {

    class func getTopViewController(base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {

        if let nav = base as? UINavigationController {
            return getTopViewController(base: nav.visibleViewController)

        } else if let tab = base as? UITabBarController, let selected = tab.selectedViewController {
            return getTopViewController(base: selected)

        } else if let presented = base?.presentedViewController {
            return getTopViewController(base: presented)
        }
        return base
    }
}

如何使用

代码语言:javascript
复制
if let topVC = UIApplication.getTopViewController() {
   topVC.view.addSubview(forgotPwdView)
}
票数 88
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26667009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档