做iOS开发的时,很多时候我们需要对获取当前所在的ViewController,搜了一下,大多数答案都不靠谱,都不能正确获取到当前的控制器,不一定能获取到当前的ViewController,于是自己写了一个方法
iOS自带的ViewController有两种
- 一种是普通控制器:UIViewController, UITableViewController, UISearchBarController等
- 一种是容器控制器:
- UINavigationController:
通过childViewController.lastObject获取当前控制器
- UITabBarController
通过selectedViewController 获取当前控制器
页面跳转有push和present,如果有present控制器,则直接取弹出的控制器,如果是导航控制器,则取最后一个,然后一层一层往下取,代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| + (UIViewController *)currentVC { UIWindow *window = [[UIApplication sharedApplication] keyWindow];
UIViewController *controller = window.rootViewController;
while (YES) { if (controller.presentedViewController) { controller = controller.presentedViewController; } else { if ([controller isKindOfClass:[UINavigationController class]]) { controller = [controller.childViewControllers lastObject]; } else if ([controller isKindOfClass:[UITabBarController class]]) { UITabBarController *tabBarController = (UITabBarController *)controller; controller = tabBarController.selectedViewController; } else { if (controller.childViewControllers.count > 0) { controller = [controller.childViewControllers lastObject]; } else { return controller; } } } } }
|
上面代码只处理了NavigationController和TabBarController,如果你没有修改过NavigationController和TabBarController的默认行为,页面跳转使用默认的push和present,那么是可以正常获取到的