从 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
}
在我的 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
}