swift Xcode警告:“windows”在iOS 15.0中已弃用:在UIWindowScene.windows相关窗口场景中使用www.example.com

bzzcjhmw  于 2023-04-19  发布在  Swift
关注(0)|答案(3)|浏览(528)

当更新我的应用程序的部署目标到15.0时,我收到以下警告:
“windows”在iOS 15.0中已弃用:在UIWindowScene.windows相关窗口场景中使用www.example.com
我已经试着在网上找了些什么来补救这个问题,但是找不到太多关于这个问题的信息。希望你能给我一些建议。
我在发生此警报的地方使用的代码行是:

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

nkcskrwz1#

@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被弃用的原因是因为它可以推广到多场景应用程序,每个应用程序都有自己的关键窗口......但这应该可以工作。
如果您仍然需要支持iOS 14,而iOS 14没有UIWindowScene.keyWindow,您可以将firstWhere(...)?.keyWindow替换为:flatMap(\.windows).first(where: \.isKeyWindow)

6qqygrtg

6qqygrtg2#

我对苹果最近实现场景的变化已经过时了。
我做了一点调查,发现了一个协议UIWindowSceneDelegate
看起来您应该向应用程序的info.plist文件添加一个“ApplicationSceneManifest”,告诉系统作为应用程序窗口场景委托的类。
然后在这个类中你要实现scene(_:willConnectTo:options:)方法。当调用这个方法时,你应该尝试将传递给你的UIScene转换为UIWindowScene,如果转换成功,你可以向窗口场景请求它的窗口并将其保存到一个示例属性。
这应该允许您保存指向应用程序窗口的指针,并在需要时使用它。

ecr0jaav

ecr0jaav3#

经过大量的研究,以下是对我有效的方法-

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

相关问题