【问题标题】:Make NSToolbarItem become first responder使 NSToolbarItem 成为第一响应者
【发布时间】:2023-04-06 15:51:01
【问题描述】:

在我的 MacOS 应用程序中,工具栏中有一个 NSSearchField。我想让用户通过按CMD+F(与许多 Apple 应用程序中使用的行为相同)来集中注意力。我创建了一个NSMenuItem,其密钥等效于CMD+F——它调用以下函数,该函数应该使NSSearchField成为第一响应者。

@IBAction func focusFilter(_ sender: NSMenuItem) {
    self.view.window?.toolbar?.items.first(where: { (item) -> Bool in
        return item.itemIdentifier.rawValue == "Search"
    })?.view?.becomeFirstResponder()
}

按下CMD+F 时,NSSearchField 似乎在很短的时间内成为第一响应者(标题开始向左移动),但随后在焦点环出现之前失去焦点(NSSearchField不会拒绝第一响应者)。

我也尝试使用NSToolbarItemmenuFormRepresentation.view,结果相同。

如何让NSToolbarItem 成为第一响应者?任何帮助表示赞赏!

【问题讨论】:

  • 来自becomeFirstResponder 的文档:“使用 NSWindow makeFirstResponder: 方法,而不是此方法,使对象成为第一响应者。切勿直接调用此方法。”。
  • @Willeke 呃,太简单了!我对 macOS 编程比较陌生,所以有时我会错过明显的东西。非常感谢您为我指明了正确的方向!

标签: swift macos first-responder nstoolbar nstoolbaritem


【解决方案1】:

正如@Willeke 所说,正确的解决方案不是使用becomeFirstResponder,而是使用NSWindow makeFirstResponder:。这段代码可以正常工作:

@IBAction func focusFilter(_ sender: NSMenuItem) {
    if let searchItem = self.view.window?.toolbar?.items.first(where: { (item) -> Bool in
        return item.itemIdentifier.rawValue == "Search"
    }) {
        self.view.window?.makeFirstResponder(searchItem.view)
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多