IOS獲取當(dāng)前頁面的UIViewController及MBProgressHUD簡單封裝

IOS獲取當(dāng)前頁面的UIViewController

在開發(fā)中我們經(jīng)常需要在當(dāng)前頁面提示Tip信息或者Alert,那么比較通用的方法是通過通用的方法拿到當(dāng)前頁面的VC。在MBProgressHUD中我們也需要一個工具類來進(jìn)行相應(yīng)的提示。

/**
 獲得當(dāng)前頁面

 @return 獲得當(dāng)前頁面
 */
+(UIViewController *)getCurrentVC {
    UIViewController *result = nil;
    UIWindow * window = [[UIApplication sharedApplication] keyWindow];
    //app默認(rèn)windowLevel是UIWindowLevelNormal,如果不是,找到UIWindowLevelNormal的
    if (window.windowLevel != UIWindowLevelNormal) {
        NSArray *windows = [[UIApplication sharedApplication] windows];
        for(UIWindow * tmpWin in windows) {
            if (tmpWin.windowLevel == UIWindowLevelNormal) {
                window = tmpWin;
                break;
            }
        }
    }
    id nextResponder = nil;
    UIViewController *appRootVC = window.rootViewController;
    //如果是present上來的appRootVC.presentedViewController不為nil
    if (appRootVC.presentedViewController) {
        nextResponder = appRootVC.presentedViewController;
    } else {
        UIView *frontView = [[window subviews] objectAtIndex:0];
        nextResponder = [frontView nextResponder];
    }
    
    if ([nextResponder isKindOfClass:[UITabBarController class]]) {
        
        UITabBarController * tabbar = (UITabBarController *)nextResponder;
        UINavigationController * nav = (UINavigationController *)tabbar.viewControllers[tabbar.selectedIndex];
        result = nav.childViewControllers.lastObject;
        
    } else if ([nextResponder isKindOfClass:[UINavigationController class]]){
        UIViewController * nav = (UIViewController *)nextResponder;
        result = nav.childViewControllers.lastObject;
    } else {
        result = nextResponder;
    }
    return result;
}

工具類簡單封裝

#import "HUDUtil.h"
#import "MBProgressHUD.h"
#import "UtilMacros.h"
#import "AppDelegate.h"
#import "StringMacros.h"

@implementation HUDUtil

/**
 顯示alert
 */
+(void)showAlertWithTitle:(NSString *)title andContent:(NSString *)content {
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title message:content preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {}];
    [alertController addAction:okAction];
    [[HUDUtil getCurrentVC] presentViewController:alertController animated:YES completion:nil];
}

/**
 顯示loading
 */
+(void)showLoading {
    MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:[HUDUtil getCurrentVC].view animated:YES];
    hud.label.text = Tip_Loading;
    hud.label.font = [UIFont systemFontOfSize:14.0f];
}

/**
 隱藏loading
 */
+(void)hiddenLoading {
    [MBProgressHUD hideHUDForView:[HUDUtil getCurrentVC].view animated:YES];
}

/**
 顯示loading
 
 @param aView 目標(biāo)顯示層
 */
+(void)showLoadingWithView:(UIView *)aView {
    MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:aView animated:YES];
    hud.label.text = Tip_Loading;
    hud.label.font = [UIFont systemFontOfSize:14.0f];
}

/**
 隱藏loading
 
 @param aView 目標(biāo)顯示層
 */
+(void)hiddenLoadingWithView:(UIView *)aView {
    [MBProgressHUD hideHUDForView:aView animated:YES];
}

/**
 顯示提示框

 @param message 提示信息
 */
+ (void)showTipWithHud:(NSString*)message{
    UIView *view = [UIApplication sharedApplication].keyWindow;
    MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:view animated:YES];
    [view bringSubviewToFront:hud];
    [hud setOffset:CGPointMake(hud.offset.x, SCREEN_HEIGHT/4)];
    hud.mode = MBProgressHUDModeText;
    hud.detailsLabel.text = message;
    hud.margin = 10.f;
    hud.removeFromSuperViewOnHide = YES;
    [hud hideAnimated:YES afterDelay:1];
}

/**
 獲得當(dāng)前頁面

 @return 獲得當(dāng)前頁面
 */
+(UIViewController *)getCurrentVC {
    UIViewController *result = nil;
    UIWindow * window = [[UIApplication sharedApplication] keyWindow];
    //app默認(rèn)windowLevel是UIWindowLevelNormal,如果不是,找到UIWindowLevelNormal的
    if (window.windowLevel != UIWindowLevelNormal) {
        NSArray *windows = [[UIApplication sharedApplication] windows];
        for(UIWindow * tmpWin in windows) {
            if (tmpWin.windowLevel == UIWindowLevelNormal) {
                window = tmpWin;
                break;
            }
        }
    }
    id nextResponder = nil;
    UIViewController *appRootVC = window.rootViewController;
    //如果是present上來的appRootVC.presentedViewController不為nil
    if (appRootVC.presentedViewController) {
        nextResponder = appRootVC.presentedViewController;
    } else {
        UIView *frontView = [[window subviews] objectAtIndex:0];
        nextResponder = [frontView nextResponder];
    }
    
    if ([nextResponder isKindOfClass:[UITabBarController class]]) {
        
        UITabBarController * tabbar = (UITabBarController *)nextResponder;
        UINavigationController * nav = (UINavigationController *)tabbar.viewControllers[tabbar.selectedIndex];
        result = nav.childViewControllers.lastObject;
        
    } else if ([nextResponder isKindOfClass:[UINavigationController class]]){
        UIViewController * nav = (UIViewController *)nextResponder;
        result = nav.childViewControllers.lastObject;
    } else {
        result = nextResponder;
    }
    return result;
}

@end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,229評論 4 61
  • 很多人都有這樣的體驗,在遇到一些難過、悲傷或者痛苦的事情的時候,好好地睡上一覺,第二天起來就會覺得沒那么傷心了。事...
    妙所閱讀 3,354評論 4 5
  • 雨后,卸下滿身的疲憊 感受大地的清涼 遍地的青草,從泥土中竄出來 含羞的花朵,發(fā)出淡淡的花香 微風(fēng)中的潮河,輕輕的...
    飛翔的櫻花閱讀 343評論 0 0
  • 初冬的天氣變得愈來愈變幻莫測了,昨夜仍是淅瀝的小雨伴著一陣陣令人顫粟的寒風(fēng),讓人清晰地意識到這秋的沒落與冬的逼...
    呵呵黃昏閱讀 170評論 1 4