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 前后的方法,然后一键替换,毕竟以后改起来也方便啊😂