UINavigationController 中有visibleViewController和topViewController
-visibleViewController当前显示的控制器
-topViewController是某个导航栈的栈定视图
-visibleViewController跟导航栈没关系,只是当前显示的控制器,也就是说任意一个导航栏的visibleViewController所返回的值应该是一样的;
-topViewController是导航栈的栈顶视图,和导航栏控制器相关,换句话说如果在同一个导航栈,visibleViewController和topViewController是没什么区别的。
方法一
#define APP_Delegate [[UIApplication sharedApplication] delegate]
/*
* 获取当前屏幕显示的 ViewController
*/
- (UIViewController *)getCurrentVC{
UIViewController *rootViewController = [[APP_Delegate window] rootViewController];
//获取当前屏幕显示的viewcontroller
UIViewController *currentVC = [self getCurrentVCFrom:rootViewController];
return currentVC;
}
- (UIViewController *)getCurrentVCFrom:(UIViewController *)rootVC{
UIViewController *currentVC;
if ([rootVC presentedViewController]) {
// 视图是被presented出来的
rootVC = [rootVC presentedViewController];
}
if ([rootVC isKindOfClass:[UITabBarController class]]) {
// 根视图为UITabBarController
currentVC = [self getCurrentVCFrom:[(UITabBarController *)rootVC selectedViewController]];
} else if ([rootVC isKindOfClass:[UINavigationController class]]){
// 根视图为UINavigationController
currentVC = [self getCurrentVCFrom:[(UINavigationController *)rootVC visibleViewController]];
} else {
// if ([rootVC isKindOfClass:[LoginRegistController class]]) { // 模态上来的类|不需要进行下一步不然有时会闪
// return currentVC;
// }
UITabBarController *tabbarVC = ((UITabBarController*)APP_Delegate.window.rootViewController).selectedViewController;
if (tabbarVC.viewControllers>0) {
//(获取不到情况下-UITabBarController,UINavigationController)
//( tabbarVC -获取第一个viewController)
UIViewController *firstVc = tabbarVC.viewControllers[tabbarVC.viewControllers.count - 1];
currentVC = firstVc;
}else{
// 根视图为非导航类
currentVC = rootVC;
}
}
return currentVC;
}
方法二
- (UIViewController*)topViewControllerWithRootViewController:(UIViewController*)rootViewController {
if ([rootViewController isKindOfClass:[UITabBarController class]]) {
UITabBarController* tabBarController = (UITabBarController*)rootViewController;
return [self topViewControllerWithRootViewController:tabBarController.selectedViewController];
} else if (rootViewController.presentedViewController) {
UIViewController* presentedViewController = rootViewController.presentedViewController;
return [self topViewControllerWithRootViewController:presentedViewController];
} else if ([rootViewController isKindOfClass:[UINavigationController class]]) {
UINavigationController* navigationController = (UINavigationController*)rootViewController;
return [self topViewControllerWithRootViewController:navigationController.visibleViewController];
} else {
return rootViewController;
}
}
值得注意的是
-
[[[UIApplication sharedApplication] keyWindow] rootViewController]有时为nil比如当页面有菊花在转的时候,这个rootViewController就为nil; - 所以使用
[[[[UIApplication sharedApplication] delegate] window] rootViewController]
或者[[[[UIApplication sharedApplication] windows] objectAtIndex:0] rootViewController]; -
presentedViewController和presentingViewController
当A弹出B
A.presentedViewController=B
B.presentingViewController=A
参考 : https://blog.csdn.net/u010960265/article/details/79731325









网友评论