问题描述
我有一个作为代理 (lsuielement) 运行的 macOS 菜单应用程序。
我需要它有一个配套的设置窗口。 NSMenu中有一个“设置”NSMenuItem,要求是打开一个实际的窗口,按下时将它带到最前面。
窗口是 SwiftUI 驱动的。这是它的工作原理:
response.data?.let { brastlewarkTown ->
hereIwantTheObject = brastlewarkTown
Log.i(TAG,"onCreateView: ${hereIwantTheObject!!.name}")
}
// main is an NSMenu
main.addItem(
withTitle: "Settings",action: #selector(AppDelegate.openSettings),keyEquivalent: "")
@objc func openSettings() {
let detailView = SettingsWindow(); // Swift UI view
let controller = DetailWindowController(rootView: detailView) // See below
controller.window?.title = "Settings";
controller.showWindow(nil)
NSApp.activate(ignoringOtherApps: true)
}
实际发生了什么
当前的行为是窗口打开,但它总是在当前处于前台的其他窗口之后。
我需要它在前台。
上面代码中的class DetailWindowController<RootView : View>: NSWindowController {
convenience init(rootView: RootView) {
let hostingController = NSHostingController(rootView: rootView.frame(width: 400,height: 500))
let window = NSWindow(contentViewController: hostingController)
window.setContentSize(NSSize(width: 400,height: 500))
self.init(window: window)
}
}
试图实现这一点,但没有奏效。
任何帮助都会很棒。非常感谢。
解决方法
最后想通了。我需要这 3 个。激活策略应该得到更好的管理,但它的价值在这里是有效的。
NSApp.setActivationPolicy(.regular)
NSApp.activate(ignoringOtherApps: true)
settingsWindow!.window?.orderFrontRegardless()
在上下文中
@objc func openSettings() {
if(settingsWindow == nil) {
let detailView = ActionWindow();
settingsWindow = DetailWindowController(rootView: detailView)
settingsWindow!.window?.title = "Cloud Brains - Settings";
settingsWindow!.showWindow(nil)
}
NSApp.setActivationPolicy(.regular)
NSApp.activate(ignoringOtherApps: true)
settingsWindow!.window?.orderFrontRegardless()
}