9

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

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

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

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

4

6 回答 6

11

斯威夫特 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
    }
}

用法

if let window = UIApplication.shared.currentWindow { 
   // do whatever you want with window
}
于 2019-11-02T17:31:13.703 回答
6

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

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

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

于 2019-09-17T16:23:20.883 回答
2

听起来您可能想将此逻辑移至您的 SceneDelegate。

SceneDelegate 现在知道窗口是否连接到场景,因此让每个连接的场景监听驱动小吃店的任何事件并将其显示在其窗口上可能是有意义的。这将导致每个可见窗口都显示小吃店(1 个或更多)。

于 2019-08-30T04:07:18.040 回答
1

你可以试试:

    if let window = UIApplication.shared.windows.first(where: { (window) -> Bool in window.isKeyWindow}) {
    //your code
    }

希望这可以帮助!

于 2019-10-09T00:18:39.810 回答
0

现在您有多个窗口,每个场景一个。首先,您必须回答您在使用时需要哪个。

可能您想获取当前活动场景的窗口,然后您可以使用它:

    UIWindow* window = nil;
    if (@available(iOS 13.0, *))
    {
        for (UIWindowScene* wScene in [UIApplication sharedApplication].connectedScenes)
        {
            if (wScene.activationState == UISceneActivationStateForegroundActive)
            {
                window = wScene.windows.firstObject;

                break;
            }
        }
    }
于 2019-09-05T13:08:57.297 回答
-1

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

于 2019-08-23T18:36:49.377 回答