作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
因此,我正在使用 UIApplication
扩展中的以下方法来获取顶 View Controller :
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
}
但问题是:它总是返回UIViewController
。但是我需要检查它是否是 MyViewController
例如。我该如何实现?
最佳答案
对返回值进行条件转换以安全地检查其类型。
if let currentVC = UIApplication.topViewController() as? MyViewController {
//the type of currentVC is MyViewController inside the if statement, use it as you want to
}
你的整个函数实现是有缺陷的,如果它真的有效,它会导致无限递归。一旦您在 if 语句中找到当前顶 View Controller 的类型,您将再次使用当前根 Controller 作为其输入值调用相同的函数。只有当它到达来自 View Controller 的调用时,你的函数才会存在,而 View Controller 的类不是你的可选绑定(bind)中指定的类。
此外,您的整个实现目前没有做任何事情。您找到了 Root View Controller 的类型,但是您通过返回 UIViewController
类型的值来向上转换它。
关于ios - 如何从 AppDelegate 获取当前可见的 viewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46077637/
我是一名优秀的程序员,十分优秀!