判斷當(dāng)前的view是不是在顯示

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);
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容