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

时间:2019-07-12 14:42:45

标签: xcode ios13 uiscenedelegate uiscene

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

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

我知道a可以使用UIView.windowUIViewController.view.window访问当前场景,但是我有一个非UI类(AppDelegate),需要在其中获取窗口(直到iOS12为止是keyWindow)才能显示小吃店应有尽有。

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

6 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

您只需要遍历所有窗口并手动查找关键窗口即可。

Person

请勿使用for (UIWindow *window in [UIApplication sharedApplication].windows) { if (window.isKeyWindow) { // you have the key window break; } } 作为支票。这意味着有些不同,人们正在通过使用逻辑来查找第一个UISceneActivationStateForegroundActive窗口场景来引入错误。

答案 2 :(得分:1)

您可以尝试:

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

希望这会有所帮助!

答案 3 :(得分:1)

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

答案 4 :(得分: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;
            }
        }
    }

答案 5 :(得分:-1)

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