iOS14 SceneDelegate創(chuàng)建window keyWindow獲取方法

xcode更新到11之后,使用iOS13 SDK創(chuàng)建的項(xiàng)目會(huì)有一個(gè)SceneDelegate類(lèi),這個(gè)類(lèi)分擔(dān)了以前appDelegate中UI的相關(guān)操作,對(duì)應(yīng)的,創(chuàng)建window指定根視圖控制器的方法也有了一些變化
一般情況下,指定完根視圖控制器,并顯示控制器的視圖如下圖


圖1.png

然而大部分app新版本發(fā)布,啟動(dòng)的時(shí)候會(huì)顯示引導(dǎo)頁(yè)面,如上圖所示,如果需要顯示GuideViewController,那就把根視圖控制器指定為GuideViewController,然后用戶點(diǎn)擊跳轉(zhuǎn)的話,再進(jìn)入app主界面,如下圖


圖2.gif

問(wèn)題就出在。。我在GuideViewController中想要獲得keyWindow,該怎么做呢?我百度了好久,oc的寫(xiě)法大家出奇的一致,我也不知道你們只是搬運(yùn)工,還是親自測(cè)試了

  UIWindow* window = nil;
 
        if (@available(iOS 13.0, *))
        {
            for (UIWindowScene* windowScene in [UIApplication sharedApplication].connectedScenes)
            {
                if (windowScene.activationState == UISceneActivationStateForegroundActive)
                {
                    window = windowScene.windows.firstObject;
 
                    break;
                }
            }
        }else{
            window = [UIApplication sharedApplication].keyWindow;
        }

然后有些小伙伴去試了試發(fā)現(xiàn)不好使,把first換成了last,然后貼一個(gè)官方文檔的截圖,然后勾選中圖中的last,如下圖

圖3.png

圖片出處
我想問(wèn)一下。。你確定知道這句話是啥意思么?人家只是告訴你windows數(shù)組里面,后添加的在最上面,那句話說(shuō)了keyWindow是最后一個(gè)了?
然后我自己親自測(cè)試了一下,我專(zhuān)門(mén)把設(shè)置根視圖控制器的window加了一個(gè)tag,tag=1001,如下圖:
圖4.png

如圖顯示,我們所說(shuō)的keyWindow應(yīng)該是第2個(gè)windows[1]
所以從這個(gè)測(cè)試結(jié)果上看。。既不是first也不是last,但是我也搞不清楚為啥是第2個(gè),我把Demo傳到github
上,有興趣看看的小伙伴自己下載跑一下,接受任何技術(shù)上的轟炸,我只想搞清楚究竟keyWindow到底去哪了

tips:我默認(rèn)認(rèn)為keyWindow就是管理根視圖控制器的那個(gè)window


2020年9月18日更新
獲取keyWindow

+ (UIWindow *)getRootWindow {

    NSArray *windows = [[UIApplication sharedApplication] windows];
    for(UIWindow *window in [windows reverseObjectEnumerator]) {
        if ([window isKindOfClass:[UIWindow class]] &&
            window.windowLevel == UIWindowLevelNormal &&
            CGRectEqualToRect(window.bounds, [UIScreen mainScreen].bounds))
            return window;
    }
    return [UIApplication sharedApplication].keyWindow;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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