【问题标题】:Xcode warning: 'windows' was deprecated in iOS 15.0: Use UIWindowScene.windows on a relevant window scene insteadXcode 警告:“windows”在 iOS 15.0 中已弃用:在相关窗口场景上使用 UIWindowScene.windows
【发布时间】:2022-01-27 05:47:05
【问题描述】:

将我的应用部署目标更新到 15.0 时,我收到以下警告:

'windows' 在 iOS 15.0 中已弃用:在 a 上使用 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
            
        }

【问题讨论】:

  • == true 是多余的

标签: swift darkmode uiwindowscene


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

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

【讨论】:

    【解决方案2】:

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

    我稍微挖掘了一下,发现了一个协议UIWindowSceneDelegate

    您似乎应该在应用的 info.plist 文件中添加一个“应用程序场景清单”,该文件告诉系统充当应用窗口场景委托的类。

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

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

    【讨论】:

      猜你喜欢
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 2023-01-16
      • 2021-09-20
      • 2020-07-03
      • 2021-11-18
      • 2011-02-06
      • 1970-01-01
      相关资源
      最近更新 更多