试了很多种方法,从window入手的相应链条,怎么都绕不开一个循环或递归,来查找顶层控制器
下面OC中用的是while
循环遍历,swift 用的是递归遍历。
1、 OC
给UIViewController
写一个分类,暴露获取方法 + (UIViewController *) getTopVC
///获取Window当前显示的ViewController
+ (UIViewController *) getTopVC{
UIViewController* vc = [UIApplication sharedApplication].keyWindow.rootViewController;
while (1) {
//顶层控制器 可能是 UITabBarController的跟控制器
if ([vc isKindOfClass:[UITabBarController class]]) {
vc = ((UITabBarController*)vc).selectedViewController;
}
//顶层控制器 可能是 push出来的 或者是跟控制器
if ([vc isKindOfClass:[UINavigationController class]]) {
vc = ((UINavigationController*)vc).visibleViewController;
}
//顶层控制器 可能是 modal出来的
if (vc.presentedViewController) {
vc = vc.presentedViewController;
}else{
break;
}
}
return vc;
}
2、 swift
一样的思路,逐级查找
//MARK: - 查找顶层控制器、
/// 获取顶层控制器 根据window
func getTopVC() -> (UIViewController?) {
var window = UIApplication.shared.keyWindow
//是否为当前显示的window
if window?.windowLevel != UIWindowLevelNormal{
let windows = UIApplication.shared.windows
for windowTemp in windows{
if windowTemp.windowLevel == UIWindowLevelNormal{
window = windowTemp
break
}
}
}
let vc = window?.rootViewController
return getTopVC(withCurrentVC: vc)
}
///根据控制器获取 顶层控制器
func getTopVC(withCurrentVC VC :UIViewController?) -> UIViewController? {
if VC == nil {
print("🌶: 找不到顶层控制器")
return nil
}
if let presentVC = VC?.presentedViewController {
//modal出来的 控制器
return getTopVC(withCurrentVC: presentVC)
}
else if let tabVC = VC as? UITabBarController {
// tabBar 的跟控制器
if let selectVC = tabVC.selectedViewController {
return getTopVC(withCurrentVC: selectVC)
}
return nil
} else if let naiVC = VC as? UINavigationController {
// 控制器是 nav
return getTopVC(withCurrentVC:naiVC.visibleViewController)
}
else {
// 返回顶控制器
return VC
}
}
网友评论