从 Catalyst 创建新的 UINSWindow

Create new UINSWindow from Catalyst

在我的 Catalyst 应用程序中,我正在使用以下代码创建第二个 window:

let userActivity = NSUserActivity(activityType: "window2")
UIApplication.shared.requestSceneSessionActivation(nil, userActivity: userActivity, options: nil) { error in
    print("error: \(error)")
}

这会创建一个新的 window,但它的类型是 NSPopoverWindow 而不是我预期的 UINSWindow

我需要更改底层 NSWindow 对象的属性,并且我已经创建了一个 MacOS Bundle 来连接 AppKit,如这篇精彩的博文中所述: Mac Catalyst: Interfacing Between UIKit and AppKit without Private APIs in Swift

那么,是否可以从 Catalyst 创建一个新的 UINSWindow,或者我是否需要使用我的 MacOS Bundle 中的 AppKit 创建它?

貌似在新场景激活时同时创建了一个新的NSPopoverWindow和一个新的UINSWindow,并且都被添加到NSApplication.sharedApplication.windows数组中。由于 NSPopoverWindow 没有 uiWindows 属性,博文中的代码崩溃了。 检查对象类型解决了我的问题:

private func nsWindow(from window: UIWindow) -> AnyObject? {
    guard let nsWindows = NSClassFromString("NSApplication")?.value(forKeyPath: "sharedApplication.windows") as? [AnyObject] else { return nil }
    for nsWindow in nsWindows {
        if !String(describing: nsWindow).contains("UINSWindow") {
            continue
        }
        
        let uiWindows = nsWindow.value(forKeyPath: "uiWindows") as? [UIWindow] ?? []
        if uiWindows.contains(window) {
            return nsWindow
        }
    }
    return nil
}