我們在非視圖類中想要隨時展示一個view時,需要將被展示的view加到當前view的子視圖,或用當前view presentViewController,或pushViewContrller,這些操作都需要獲取當前正在顯示的ViewController。
#pragma mark 獲取當前屏幕顯示的viewcontroller - (UIViewController *)getCurrentVC { // 定義一個變量存放當前屏幕顯示的viewcontroller UIViewController *result = nil; // 得到當前應用程序的關鍵窗口(正在活躍的窗口) UIWindow * window = [[UIApplication sharedApplication] keyWindow]; // windowLevel是在 Z軸 方向上的窗口位置,默認值為UIWindowLevelNormal if (window.windowLevel != UIWindowLevelNormal) { // 獲取應用程序所有的窗口 NSArray *windows = [[UIApplication sharedApplication] windows]; for(UIWindow * tmpWin in windows) { // 找到程序的默認窗口(正在顯示的窗口) if (tmpWin.windowLevel == UIWindowLevelNormal) { // 將關鍵窗口賦值為默認窗口 window = tmpWin; break; } } } // 獲取窗口的當前顯示視圖 UIView *frontView = [[window subviews] objectAtIndex:0]; // 獲取視圖的下一個響應者,UIView視圖調用這個方法的返回值為UIViewController或它的父視圖 id nextResponder = [frontView nextResponder]; // 判斷顯示視圖的下一個響應者是否為一個UIViewController的類對象 if ([nextResponder isKindOfClass:[UIViewController class]]) { result = nextResponder; } else { result = window.rootViewController; } return result; }