Swift 获取当前屏幕显示的控制器
这篇文章你将学到repeat…while循环
如果满足while条件会一直循环,直到不满足while条件
/// 获取keyWindow
static func ex_keyWindow() -> UIWindow? {
var keyWindow: UIWindow? = nil
if #available(iOS 13, *) {
keyWindow = UIApplication.shared.connectedScenes
.compactMap { $0 as? UIWindowScene }
.flatMap { $0.windows }
.first(where: { $0.isKeyWindow })
} else {
keyWindow = UIApplication.shared.keyWindow
}
return keyWindow
}
/// 获取最底层window
static func ex_rootWindow() -> UIWindow? {
var rootWindow: UIWindow? = nil
if #available(iOS 13, *) {
rootWindow = UIApplication.shared.connectedScenes
.compactMap { $0 as? UIWindowScene }
.flatMap { $0.windows }
.first
}
if let _ = rootWindow {}
else if let w = UIApplication.shared.delegate?.window {
rootWindow = w
}
else if let w = UIApplication.shared.windows.first {
rootWindow = w
}
return rootWindow
}
/// 获取当前屏幕显示的viewcontroller
static func ex_presentController() -> UIViewController? {
var result: UIViewController? = nil
var rootVC: UIViewController? = nil
if let v = self.ex_keyWindow()?.rootViewController {
rootVC = v
}
else if let v = self.ex_rootWindow()?.rootViewController {
rootVC = v
}
repeat {
if let navi = rootVC as? UINavigationController {
result = navi.visibleViewController
rootVC = result?.presentedViewController
}
else if let tab = rootVC as? UITabBarController {
result = tab.selectedViewController
rootVC = result
}
else {
result = rootVC
rootVC = nil
}
} while rootVC != nil
return result
}
OC获取当前屏幕显示的控制器
+ (UIViewController *)getCurrentShowViewController
{
UIViewController* viewController = [UIApplication sharedApplication].delegate.window.rootViewController;
return[self findBestViewController:viewController];
}
//递归方法
+ (UIViewController*)findBestViewController:(UIViewController*)vc {
if (vc.presentedViewController) {
// Return presented view controller
return [self findBestViewController:vc.presentedViewController];
}else if ([vc isKindOfClass:[UISplitViewController class]]) {
// Return right hand side
UISplitViewController* svc = (UISplitViewController*) vc;
if (svc.viewControllers.count > 0) {
return [self findBestViewController:svc.viewControllers.lastObject];
} else {
return vc;
}
}else if ([vc isKindOfClass:[UINavigationController class]]) {
// Return top view
UINavigationController* svc = (UINavigationController*) vc;
if (svc.viewControllers.count > 0){
return [self findBestViewController:svc.topViewController];
} else {
return vc;
}
}else if ([vc isKindOfClass:[UITabBarController class]]) {
// Return visible view
UITabBarController* svc = (UITabBarController*) vc;
if (svc.viewControllers.count > 0)
return [self findBestViewController:svc.selectedViewController];
else
return vc;
}else{
return vc;
}
}