0

将我的应用程序的部署目标更新到 15.0 时,我收到此警告:

'windows' 在 iOS 15.0 中已弃用:在相关窗口场景上使用 UIWindowScene.windows

我试图在网上查看可以采取哪些措施来解决此问题,但找不到太多有关此的信息。希望你能分享一些建议。

我在发生此警报的位置使用的代码行是:

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

2 回答 2

1

@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 的原因是因为泛化到多场景应用程序,每个应用程序都可能有自己的关键窗口......但这应该有效。

如果您仍然需要支持没有 的 iOS 14,UIWindowScene.keyWindow您可以将 替换为firstWhere(...)?.keyWindowflatMap(\.windows).first(where: \.isKeyWindow)

于 2022-01-26T21:35:34.693 回答
0

我对 Apple 最近为实现场景所做的更改已经过时了。

我做了一点挖掘,找到了一个协议UIWindowSceneDelegate

看起来您应该将“应用程序场景清单”添加到应用程序的 info.plist 文件中,该文件告诉系统用作应用程序窗口场景委托的类。

然后在那个类中你要实现方法scene(_:willConnectTo:options:)。当调用该方法时,您应该尝试将UIScene传递给您的内容转换为 a UIWindowScene,如果该转换成功,您可以向窗口场景询问它的窗口并将其保存到实例属性中。

这应该允许您保存指向应用程序窗口的指针并在需要时使用它。

于 2022-01-26T21:21:02.310 回答