iOS 13.0 废弃 ‘keyWindow’

iOS 13.0中已弃用“ keyWindow”:不应将其用于支持多个场景的应用程序,因为它会返回所有已连接场景的关键窗口

我该如何显示对话框?

这个用的还挺多之前项目中的一些弹框之类的很多都加在了keyWindow上了,一部分是模态控制器。以前是这么写的[[UIApplication sharedApplication].keyWindow addSubview: 自定义View];

13.0禁用后怎么解决呢?也不难:

OC

 UIWindow *window =  [[[UIApplication sharedApplication] windows] objectAtIndex:0];
  [window addSubview:自定义View];

或者:
-(UIWindow*)keyWindow
{
    UIWindow *foundWindow = nil;
    NSArray  *windows = [[UIApplication sharedApplication]windows];
    for (UIWindow  *window in windows) {
        if (window.isKeyWindow) {
            foundWindow = window;
            break;
        }
    }
    return foundWindow;
}

移除view : 自定义的view加个tag然后移除

[[windowV  viewWithTag:200]removeFromSuperview];

swift

方法一:
let window = UIApplication.shared.windows.filter {$0.isKeyWindow}.first

或者

let window = UIApplication.shared.windows.first { $0.isKeyWindow }


方法二

let  window = UIApplication.shared.connectedScenes
        .filter({$0.activationState == .foregroundActive})
        .map({$0 as? UIWindowScene})
        .compactMap({$0})
        .first?.windows
        .filter({$0.isKeyWindow}).first

//从层级图上来看 ,紫色的就是获取的到的window:

tip:添加多个弹框时需要注意先后顺序,防止遮挡,当然也可通过模态来制作弹框

+(UIWindow*)getCurrentWindow{
    
    if ([[[UIApplication sharedApplication] delegate]window]) {
        return [[[UIApplication sharedApplication] delegate]window];
    } else {
        if (@available(iOS 13.0,*)) {
       UIWindow *foundWindow = nil;
      NSArray  *windows = [[UIApplication sharedApplication]windows];
       for (UIWindow  *window in windows) {
         if (window.isKeyWindow) {
            foundWindow = window;
            break;
         }
    }
    return foundWindow;
        } else {
            return  [UIApplication sharedApplication].keyWindow;
        }
    }
}

这个用的还挺多的,简单封装起来, 判断好13.0 前后的方法,然后一键替换,毕竟以后改起来也方便啊😂

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐