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