1.我們在非視圖類中想要隨時展示一個view時,需要將被展示的view加到當(dāng)前view的子視圖,或用當(dāng)前view presentViewController,或pushViewContrller,這些操作都需要獲取當(dāng)前正在顯示的ViewController。
[objc] view plaincopy
//獲取當(dāng)前屏幕顯示的viewcontroller
-
(UIViewController *)getCurrentVC
{
UIViewController *result = nil;UIWindow * window = [[UIApplication sharedApplication] keyWindow];
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];
id nextResponder = [frontView nextResponder];if ([nextResponder isKindOfClass:[UIViewController class]])
result = nextResponder;
else
result = window.rootViewController;return result;
}
2.獲取當(dāng)前屏幕中present出來的viewcontroller。
[objc] view plaincopy
-
(UIViewController *)getPresentedViewController
{
UIViewController *appRootVC = [UIApplication sharedApplication].keyWindow.rootViewController;
UIViewController *topVC = appRootVC;
if (topVC.presentedViewController) {
topVC = topVC.presentedViewController;
}return topVC;
}
某些情況下,需判斷當(dāng)前ViewController是否正在顯示,比如后臺網(wǎng)絡(luò)請求報錯,我們可能只希望在發(fā)起請求的頁面彈窗提示用戶,當(dāng)用戶已經(jīng)跳轉(zhuǎn)到其他界面,不做彈窗,減少對用戶的干擾。
假如一個UIView對象當(dāng)前正在顯示,那么它的window屬性肯定為非空值。雖然官方文檔未說明UIView未顯示時window屬性的取值,但是經(jīng)過簡單的測試,大部分情況下UIView未顯示時,window的值為空,因此依據(jù)此判斷當(dāng)前UIViewController是否正在顯示。但是訪問UIViewController的view屬性時,可能會引起view加載(假如此時還未加載),這是不必要的,而且還可能引起無法預(yù)期的問題。因此在訪問view屬性之前,最好先檢查isViewLoaded屬性來避免上述問題。
示例代碼如下,在UIViewController的擴(kuò)展中聲明了一個isVisible方法,方便以后調(diào)用
技術(shù)分享
注意:UIView的官方文檔中僅注明當(dāng)view還未添加到window時,window屬性為空;但是并未提及當(dāng)window為nil時,當(dāng)前view未顯示。通過簡單的Demo檢測上文的方法可滿足大部分需求,因此使用時建議進(jìn)行簡單測試!
瞬間覺得自己好low 哈哈 ,但是要注意 該方法實用的條件哦!!! 不是特殊情況處理下的視圖控制器,一般都能用.
我寫了一個類方法 為了調(diào)用更方便哈哈
如下:
+(BOOL)isCurrentViewControllerVisible:(UIViewController *)viewController
{
return (viewController.isViewLoaded && viewController.view.window);
}