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

olqngx59  于 2023-08-07  发布在  其他
关注(0)|答案(7)|浏览(189)

我正在将我的iOS13应用程序转换为iPadOS到SceneDelegate(多窗口)。
如何从当前SceneDelegate获取当前UIWindow?
我知道a可以使用UIView.windowUIViewController.view.window访问当前场景,但我有一个非UI类(AppDelegate),我需要在其中获取窗口(keyWindow直到iOS12)以在所有内容之上显示小吃店。
我以前用[UIApplication sharedApplication].keyWindow,但现在,当然,这是错误的。

zpqajqem

zpqajqem1#

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
}

beq87vna

beq87vna2#

你只需要遍历所有的窗口,然后手动找到关键窗口。

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

字符串

  • 请勿 * 使用UISceneActivationStateForegroundActive作为检查。这意味着一些不同的东西,人们通过使用逻辑来查找第一个UISceneActivationStateForegroundActive窗口场景来引入bug。
hjqgdpho

hjqgdpho3#

听起来您可能希望将此逻辑移动到SceneDelegate。
SceneDelegate现在知道窗口是否连接到场景,因此让每个连接的场景侦听驱动小吃店的任何事件并在其窗口上显示它可能是有意义的。然后,这将导致每个可见窗口显示小吃棒(1个或更多个)。

4smxwvx5

4smxwvx54#

您可以尝试:

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

字符串
希望这对你有帮助!

2jcobegt

2jcobegt5#

现在您有多个窗口,每个场景一个。首先,你必须回答在使用的时候你需要哪一个。
也许你想获得当前活动场景的窗口,那么你可以使用这个:

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

                break;
            }
        }
    }

字符串

kyks70gy

kyks70gy6#

适用于SwiftUI,已在iOS 16及以上版本中测试

extension UIApplication {
    var currentWindow: UIWindow? {
        connectedScenes
            .compactMap { $0 as? UIWindowScene }
            .first?
            .windows
            .first
    }
}

字符串
这是惯例。

guard let anchor = UIApplication.shared.currentWindow else {
   fatalError("Window did not found in Hierarchy")
}

t98cgbkg

t98cgbkg7#

我还没有尝试过这个,但是你应该可以用[UIApplication sharedApplication].windows得到所有的窗口,然后选择是在所有窗口上显示小吃店还是在一个窗口上显示小吃店。

相关问题