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