Xcode 警告:'windows'已在 iOS 15.0 中弃用:在相关窗口场景中改用 UIWindowScene.windows



当我将应用程序的部署目标更新到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属性,它列出了在应用程序中工作的所有当前活动场景(对于大多数应用程序,这只是一个主场景(。

在这些场景中,您可以筛选为UIWindowScenes的场景(忽略当前未激活且在前景中的场景(,并且在其中,找到具有关键窗口的第一个场景:

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;
}
}

相关内容

  • 没有找到相关文章

最新更新