iOS14 SceneDelegate创建window keyWindow获取方法

xcode更新到11之后,使用iOS13 SDK创建的项目会有一个SceneDelegate类,这个类分担了以前appDelegate中UI的相关操作,对应的,创建window指定根视图控制器的方法也有了一些变化
一般情况下,指定完根视图控制器,并显示控制器的视图如下图


图1.png

然而大部分app新版本发布,启动的时候会显示引导页面,如上图所示,如果需要显示GuideViewController,那就把根视图控制器指定为GuideViewController,然后用户点击跳转的话,再进入app主界面,如下图


图2.gif

问题就出在。。我在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,如下图

图3.png

图片出处
我想问一下。。你确定知道这句话是啥意思么?人家只是告诉你windows数组里面,后添加的在最上面,那句话说了keyWindow是最后一个了?
然后我自己亲自测试了一下,我专门把设置根视图控制器的window加了一个tag,tag=1001,如下图:
图4.png

如图显示,我们所说的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;
}

你可能感兴趣的:(iOS14 SceneDelegate创建window keyWindow获取方法)