单击菜单按钮时如何激活菜单栏 (NSPopover) 应用程序?
How do I make a Menu Bar (NSPopover) App active when clicking on the menu button?
我有一个位于菜单栏中的应用程序,当您单击该按钮时,它会显示一个 NSPopover。
一切正常,但我希望 NSSearchField 成为第一响应者,这样用户就可以直接在框中键入。
但是,如果尚未选择该应用程序,它将无法运行。虽然看起来搜索框处于活动状态,但键盘输入会转到之前打开的应用程序,因为从技术上讲它仍然是活动的 window.
我已经看到一些关于此类问题的问题,但它们都需要像 makekeyandorder 这样的 objc 方法,或者只是不适用于 NSPopover 的东西。
所以我的问题是 - 有没有一种方法可以在按下按钮时强制应用程序成为活动应用程序?
我胡乱猜测并尝试了 NSApplication().sharedApplication().becomeFirstResponder()
,但没有成功。
如果有另一种方法,我刚刚完全错过了,请告诉我!
最后我自己修好了,结果果然很简单。
我需要做的就是在 ViewControllers viewDidAppear()
方法中调用 NSApplication.sharedApplication().activateIgnoringOtherApps(true)
。
它修复了一切!
尽管@Christopher_Hannah 的答案有效,但文档中明确指出,
You don’t need to send this message to make one of the app’s NSWindows key. When you send a makeKey() message to an NSWindow object, you ensure that it is the key window when the app is active.
所以假设我们在视图控制器中,您需要做的就是
override func viewDidAppear() {
super.viewDidAppear()
view.window?.makeKey()
}
final class HostingView<Content: View>: NSHostingView<Content> {
override func viewDidMoveToWindow() {
window?.becomeKey()
}
}
然后像这样使用:
let item = NSMenuItem()
let contentView = ContentView()
let hv = HostingView(rootView: contentView)
hv.frame = NSRect(x: 0, y: 0, width: 500, height: 500)
item.view = hv
let menu = NSMenu()
menu.items = [item]
我有一个位于菜单栏中的应用程序,当您单击该按钮时,它会显示一个 NSPopover。
一切正常,但我希望 NSSearchField 成为第一响应者,这样用户就可以直接在框中键入。
但是,如果尚未选择该应用程序,它将无法运行。虽然看起来搜索框处于活动状态,但键盘输入会转到之前打开的应用程序,因为从技术上讲它仍然是活动的 window.
我已经看到一些关于此类问题的问题,但它们都需要像 makekeyandorder 这样的 objc 方法,或者只是不适用于 NSPopover 的东西。
所以我的问题是 - 有没有一种方法可以在按下按钮时强制应用程序成为活动应用程序?
我胡乱猜测并尝试了 NSApplication().sharedApplication().becomeFirstResponder()
,但没有成功。
如果有另一种方法,我刚刚完全错过了,请告诉我!
最后我自己修好了,结果果然很简单。
我需要做的就是在 ViewControllers viewDidAppear()
方法中调用 NSApplication.sharedApplication().activateIgnoringOtherApps(true)
。
它修复了一切!
尽管@Christopher_Hannah 的答案有效,但文档中明确指出,
You don’t need to send this message to make one of the app’s NSWindows key. When you send a makeKey() message to an NSWindow object, you ensure that it is the key window when the app is active.
所以假设我们在视图控制器中,您需要做的就是
override func viewDidAppear() {
super.viewDidAppear()
view.window?.makeKey()
}
final class HostingView<Content: View>: NSHostingView<Content> {
override func viewDidMoveToWindow() {
window?.becomeKey()
}
}
然后像这样使用:
let item = NSMenuItem()
let contentView = ContentView()
let hv = HostingView(rootView: contentView)
hv.frame = NSRect(x: 0, y: 0, width: 500, height: 500)
item.view = hv
let menu = NSMenu()
menu.items = [item]