ios - UIAlertController 下最顶层的 ViewController

标签 ios swift uiviewcontroller uialertcontroller

我正在使用以下扩展来查找 top most ViewController . 如果出现警报,上面的代码会给出 UIAlertController。 如何在 UIAlertController 下获取顶 View Controller ?

最佳答案

像下面这样创建一个 UIApplication 扩展,UIApplication.topViewController() 将返回 UIAlertController 下最顶层的 UIViewController

iOS 13+

extension UIApplication {

    class func topViewController(controller: UIViewController? = UIApplication.shared.windows.first?.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)
        }
        if let alert = controller as? UIAlertController {
            if let navigationController = alert.presentingViewController as? UINavigationController {
                return navigationController.viewControllers.last
            }
            return alert.presentingViewController
        }
        return controller
    }

}

iOS 12-

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)
        }
        if let alert = controller as? UIAlertController {
            if let navigationController = alert.presentingViewController as? UINavigationController {
                return navigationController.viewControllers.last
            }
            return alert.presentingViewController
        }
        return controller
    }

}

关于ios - UIAlertController 下最顶层的 ViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36284476/

相关文章:

swift - Swift 中有没有一种方法可以计算 3 个数字的所有可能加法、乘法、减法或除法。包括括号

ios - 如何取消初始化子 UIViewController?

objective-c - 以编程方式调用 segue 原因 NSInvalidArgumentException,原因 : 'UILabel length' unrecognized selector

ios - 使用 slider /实用程序的应用内用户偏好

ios - 如何确定View的背景颜色?

swift - 用于添加噪波的 Metal 性能着色器

swift - 如何以操作的形式更改 ViewController 之间的数据?

ios - 更改静态 UITableViewCell 的高度以适合内容

ios - 带有通知内容扩展的折叠通知中的小缩略图

ios - 具有透明背景的 Swift 模态视图 Controller