我正在尝试获取不在 AppDelegate 中的当前显示 UIViewController
,但它似乎总是获取初始顶部 UIViewController
,而不是当前显示的 UIViewController
.
AppDelegate 中的以下代码确实获得了当前的 UIViewController
,但是当我在我的任何一个 View Controller 中使用它时,这个相同的功能不起作用:
func getTopViewController() -> UIViewController
{
var topViewController = UIApplication.sharedApplication().delegate!.window!!.rootViewController!
while (topViewController.presentedViewController != nil) {
topViewController = topViewController.presentedViewController!
}
return topViewController
}
以上代码是作为类似问题的答案提供的: Get the current displaying UIViewController on the screen in AppDelegate.m
无论我深入到多深,我只能检索到最前面的 View Controller 。
如何获取当前呈现的 UIViewController
?
仅供引用:我不使用UINavigationController
,只是常规的UIViewController
类。
最佳答案
我不喜欢使用它,但有时它是必要的。
static func getTopViewController() -> UIViewController {
var viewController = UIViewController()
if let vc = UIApplication.shared.delegate?.window??.rootViewController {
viewController = vc
var presented = vc
while let top = presented.presentedViewController {
presented = top
viewController = top
}
}
return viewController
}
**编辑:
这是一个改进的版本,它总是获取最顶层的 View Controller
static var top: UIViewController? {
get {
return topViewController()
}
}
static var root: UIViewController? {
get {
return UIApplication.shared.delegate?.window??.rootViewController
}
}
static func topViewController(from viewController: UIViewController? = UIViewController.root) -> UIViewController? {
if let tabBarViewController = viewController as? UITabBarController {
return topViewController(from: tabBarViewController.selectedViewController)
} else if let navigationController = viewController as? UINavigationController {
return topViewController(from: navigationController.visibleViewController)
} else if let presentedViewController = viewController?.presentedViewController {
return topViewController(from: presentedViewController)
} else {
return viewController
}
}
关于ios - 如何获取当前显示的 UIViewController 不在 AppDelegate 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41073915/