iOS 獲取當前頁面控制器
阿新 • • 發佈:2018-11-02
在開發過程中,我們經常需要獲取當前 window, rootViewController, 以及當前 ViewController 的需求,來實現跳轉或者其他業務需求. 如果 .m 實現不是在當前視檢視情況下, 或者在子檢視中,我們需要快速的獲取到當前控制器,.
我們想要與控制器無耦合的情況下, 想要直接獲取到當前控制器, 基本都是通過 rootViewController 來查詢的, 通過上面的方法拿到 rootViewControoler 之後, 我們先看 presentedViewController
最後在判斷當前控制器是否有子控制器的情況, 如果有則取其子控制器最頂層, 否則當前控制器就是其本身。
+ (UIViewController *)xs_getCurrentViewController{ UIWindow* window = [[[UIApplication sharedApplication] delegate] window]; NSAssert(window, @"The window is empty"); //獲取根控制器 UIViewController* currentViewController = window.rootViewController; //獲取當前頁面控制器 BOOL runLoopFind = YES; while (runLoopFind){ if (currentViewController.presentedViewController) { currentViewController = currentViewController.presentedViewController; } else if ([currentViewController isKindOfClass:[UINavigationController class]]) { UINavigationController* navigationController = (UINavigationController* )currentViewController; currentViewController = [navigationController.childViewControllers lastObject]; } else if ([currentViewController isKindOfClass:[UITabBarController class]]){ UITabBarController* tabBarController = (UITabBarController* )currentViewController; currentViewController = tabBarController.selectedViewController; } else { NSUInteger childViewControllerCount = currentViewController.childViewControllers.count; if (childViewControllerCount > 0) { currentViewController = currentViewController.childViewControllers.lastObject; return currentViewController; } else { return currentViewController; } } } return currentViewController; }
這裡主要是查詢當前 應用程式基於 UITabBarController 和 UINavigationControler 下管理的檢視控制器, 如果還有其他控制器則需要新增 if 條件來進行判斷。