1. 程式人生 > >iOS 獲取當前頁面控制器

iOS 獲取當前頁面控制器

    在開發過程中,我們經常需要獲取當前 window, rootViewController, 以及當前 ViewController 的需求,來實現跳轉或者其他業務需求. 如果 .m 實現不是在當前視檢視情況下, 或者在子檢視中,我們需要快速的獲取到當前控制器,.

    我們想要與控制器無耦合的情況下, 想要直接獲取到當前控制器, 基本都是通過 rootViewController 來查詢的, 通過上面的方法拿到 rootViewControoler 之後, 我們先看 presentedViewController

, 因為控制器呈現出來的方式有 push 與 present, 我們先檢視它是否是 present 出來的, 如果是則通過此屬效能找到 present 出來的當前控制器, 然後在檢查是否屬於 UINavigationControler 或 UITabBarController ,如果是則通過查詢其子控制器裡面最頂層或者其正在選擇的控制器。
最後在判斷當前控制器是否有子控制器的情況, 如果有則取其子控制器最頂層, 否則當前控制器就是其本身。
 


+ (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 條件來進行判斷。