UIViewController+LookinServer.m 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. //
  2. // UIViewController+LookinServer.m
  3. // LookinServer
  4. //
  5. // Created by Li Kai on 2019/4/22.
  6. // https://lookin.work
  7. //
  8. #import "UIViewController+LookinServer.h"
  9. #import "UIView+LookinServer.h"
  10. #import <objc/runtime.h>
  11. @implementation UIViewController (LookinServer)
  12. + (void)load {
  13. static dispatch_once_t onceToken;
  14. dispatch_once(&onceToken, ^{
  15. Method oriMethod = class_getInstanceMethod([self class], @selector(viewDidLoad));
  16. Method newMethod = class_getInstanceMethod([self class], @selector(lks_viewDidLoad));
  17. method_exchangeImplementations(oriMethod, newMethod);
  18. });
  19. }
  20. - (void)lks_viewDidLoad {
  21. [self lks_viewDidLoad];
  22. self.view.lks_hostViewController = self;
  23. }
  24. + (nullable UIViewController *)lks_visibleViewController {
  25. UIViewController *rootViewController = [UIApplication sharedApplication].keyWindow.rootViewController;
  26. UIViewController *visibleViewController = [rootViewController lks_visibleViewControllerIfExist];
  27. return visibleViewController;
  28. }
  29. - (UIViewController *)lks_visibleViewControllerIfExist {
  30. if (self.presentedViewController) {
  31. return [self.presentedViewController lks_visibleViewControllerIfExist];
  32. }
  33. if ([self isKindOfClass:[UINavigationController class]]) {
  34. return [((UINavigationController *)self).visibleViewController lks_visibleViewControllerIfExist];
  35. }
  36. if ([self isKindOfClass:[UITabBarController class]]) {
  37. return [((UITabBarController *)self).selectedViewController lks_visibleViewControllerIfExist];
  38. }
  39. if (self.isViewLoaded && !self.view.hidden && self.view.alpha > 0.01) {
  40. return self;
  41. } else {
  42. return nil;
  43. }
  44. }
  45. @end