xcode更新到11之后,使用iOS13 SDK创建的项目会有一个SceneDelegate类,这个类分担了以前appDelegate中UI的相关操作,对应的,创建window指定根视图控制器的方法也有了一些变化
一般情况下,指定完根视图控制器,并显示控制器的视图如下图
然而大部分app新版本发布,启动的时候会显示引导页面,如上图所示,如果需要显示GuideViewController,那就把根视图控制器指定为GuideViewController,然后用户点击跳转的话,再进入app主界面,如下图
问题就出在。。我在GuideViewController中想要获得keyWindow,该怎么做呢?我百度了好久,oc的写法大家出奇的一致,我也不知道你们只是搬运工,还是亲自测试了
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;
}
然后有些小伙伴去试了试发现不好使,把first换成了last,然后贴一个官方文档的截图,然后勾选中图中的last,如下图
图片出处
我想问一下。。你确定知道这句话是啥意思么?人家只是告诉你windows数组里面,后添加的在最上面,那句话说了keyWindow是最后一个了?
然后我自己亲自测试了一下,我专门把设置根视图控制器的window加了一个tag,tag=1001,如下图:
如图显示,我们所说的keyWindow应该是第2个windows[1]
所以从这个测试结果上看。。既不是first也不是last,但是我也搞不清楚为啥是第2个,我把Demo传到github
上,有兴趣看看的小伙伴自己下载跑一下,接受任何技术上的轰炸,我只想搞清楚究竟keyWindow到底去哪了
tips:我默认认为keyWindow就是管理根视图控制器的那个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;
}