单击菜单按钮时如何激活菜单栏 (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]