RQControllerHelper.m 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. //
  2. // RQControllerHelper.m
  3. // RQCommon
  4. //
  5. // Created by 张嵘 on 2018/11/23.
  6. // Copyright © 2018 张嵘. All rights reserved.
  7. // 管理视图控制器的工具类
  8. #import "RQControllerHelper.h"
  9. #import "RQMainTabBarViewController.h"
  10. @implementation RQControllerHelper
  11. + (UIViewController *)currentViewController {
  12. UIViewController *resultVC;
  13. resultVC = [self _topViewController:[[UIApplication sharedApplication].keyWindow rootViewController]];
  14. /// RQ Fixed : 这里必须要判断一下,否则取出来永远都是 RQMainTabBarViewController。这是架构上小缺(特)陷(性)。因为RQMainTabBarViewController的子控制器是UITabBarController,所以需要递归UITabBarController的所有的子控制器
  15. if ([resultVC isKindOfClass:[RQMainTabBarViewController class]]) {
  16. RQMainTabBarViewController *mainVc = (RQMainTabBarViewController *)resultVC;
  17. resultVC = [self _topViewController:mainVc.tabBarController];
  18. }
  19. while (resultVC.presentedViewController) {
  20. resultVC = [self _topViewController:resultVC.presentedViewController];
  21. }
  22. return resultVC;
  23. }
  24. + (UIViewController *)_topViewController:(UIViewController *)vc {
  25. if ([vc isKindOfClass:[UINavigationController class]]) {
  26. return [self _topViewController:[(UINavigationController *)vc topViewController]];
  27. } else if ([vc isKindOfClass:[UITabBarController class]]) {
  28. return [self _topViewController:[(UITabBarController *)vc selectedViewController]];
  29. } else {
  30. return vc;
  31. }
  32. }
  33. + (UINavigationController *)topNavigationController{
  34. return RQSharedAppDelegate.navigationControllerStack.topNavigationController;
  35. }
  36. + (RQBaseViewController *)topViewController
  37. {
  38. RQBaseViewController *topViewController = (RQBaseViewController *)[self topNavigationController].topViewController;
  39. /// 确保解析出来的类 也是 RQBaseViewController
  40. NSAssert([topViewController isKindOfClass:RQBaseViewController.class], @"topViewController is not an RQBaseViewController's subclass: %@", topViewController);
  41. return topViewController;
  42. }
  43. @end