当我将应用程序的部署目标更新到15.0时,我收到以下警告:
"窗口"在iOS 15.0中已被弃用:在相关窗口场景而非
我曾试图在网上查找可以采取的措施,但找不到太多关于这方面的信息。希望你能分享一些建议。
发生此警报的代码行是:
let window = UIApplication.shared.windows[0]
然后在我的ViewDidLoad((中:
DispatchQueue.main.async { [weak self] in
if defaults.bool(forKey: "darkModeBoolSwitch") == true {
self?.window.overrideUserInterfaceStyle = .dark
} else if defaults.bool(forKey: "darkModeBoolSwitch") == false {
self?.window.overrideUserInterfaceStyle = .light
}
@DuncanC解决方案的一个替代方案可能也适用于您:UIApplication
有一个connectedScenes
属性,它列出了在应用程序中工作的所有当前活动场景(对于大多数应用程序,这只是一个主场景(。
在这些场景中,您可以筛选为UIWindowScene
s的场景(忽略当前未激活且在前景中的场景(,并且在其中,找到具有关键窗口的第一个场景:
extension UIApplication {
static var firstKeyWindowForConnectedScenes: UIWindow? {
UIApplication.shared
// Of all connected scenes...
.connectedScenes.lazy
// ... grab all foreground active window scenes ...
.compactMap { $0.activationState == .foregroundActive ? ($0 as? UIWindowScene) : nil }
// ... finding the first one which has a key window ...
.first(where: { $0.keyWindow != nil })?
// ... and return that window.
.keyWindow
}
}
我不太愿意把这个扩展称为UIApplication.keyWindow
,因为这些API被弃用的原因是对多场景应用程序的泛化,每个应用程序可能都有自己的关键窗口。。。但这应该奏效。
如果您仍然需要支持没有UIWindowScene.keyWindow
的iOS 14,可以将firstWhere(...)?.keyWindow
替换为:flatMap(.windows).first(where: .isKeyWindow)
。
我对苹果最近为实现场景所做的更改已经过时了。
我做了一点挖掘,发现了一个协议UIWindowSceneDelegate
看起来你应该添加一个";应用场景清单";到应用程序的info.plist文件,该文件告诉系统用作应用程序窗口场景代理的类。
然后在该类中,您想要实现方法scene(_:willConnectTo:options:)
。当调用该方法时,您必须尝试将传递给的UIScene
强制转换为UIWindowScene
,如果转换成功,您可以向窗口场景询问其窗口,并将其保存到实例属性中。
这应该允许你保存一个指向应用程序窗口的指针,并在需要时使用它。
经过大量研究,以下是对我有效的方法-
UIWindow *firstWindow = nil;
NSSet *scenes = [[UIApplication sharedApplication] connectedScenes];
NSArray *windows = nil;
for (id aScene in scenes) {
if ([aScene activationState] == UISceneActivationStateForegroundActive) {
windows = [aScene windows];
break;
}
}
for (UIWindow *window in windows) {
if (window.isKeyWindow) {
firstWindow = window;
break;
}
}