如何获得多窗口 SceneDelegate Xcode 11 的当前 keywindow 等效项?

Fab*_*oft 7 xcode ios13 uiscenedelegate uiscene

我正在将适用于 iPadOS 的 iOS13 应用程序转换为 SceneDelegate(多窗口)。

如何从当前的 SceneDelegate 获取当前的 UIWindow?

我知道 a 可以使用UIView.windowor访问当前场景UIViewController.view.window,但是我有一个非 UI 类(AppDelegate),我需要在其中获取窗口(iOS12 之前的 keyWindow)以在所有内容的顶部显示小吃吧。

我曾经这样做,[UIApplication sharedApplication].keyWindow但现在,当然,这是错误的。

Ale*_*ano 10

斯威夫特 5.x / iOS 13.x

受到许多解决方案的启发,为了找回我的旧窗口属性(在 connectedScenes 中搜索它),我实现了一个小扩展:

extension UIApplication {
    var currentWindow: UIWindow? {
        connectedScenes
        .filter({$0.activationState == .foregroundActive})
        .map({$0 as? UIWindowScene})
        .compactMap({$0})
        .first?.windows
        .filter({$0.isKeyWindow}).first
    }
}
Run Code Online (Sandbox Code Playgroud)

用法

if let window = UIApplication.shared.currentWindow { 
   // do whatever you want with window
}
Run Code Online (Sandbox Code Playgroud)


NSP*_*mer 6

您需要简单地遍历所有窗口并手动找到关键窗口。

for (UIWindow *window in [UIApplication sharedApplication].windows) {
    if (window.isKeyWindow) {
        // you have the key window
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

不要使用UISceneActivationStateForegroundActive作为检查。这意味着一些不同的东西,人们通过使用逻辑来找到第一个UISceneActivationStateForegroundActive窗口场景来引入错误。


Gab*_*abe -2

我还没有尝试过这一点,但您应该能够获取所有窗口[UIApplication sharedApplication].windows,然后选择是否要在所有窗口或一个窗口上显示小吃栏。