使 NSToolbarItem 成为第一响应者

Posted

技术标签:

【中文标题】使 NSToolbarItem 成为第一响应者【英文标题】:Make NSToolbarItem become first responder 【发布时间】:2018-07-29 13:39:06 【问题描述】:

在我的 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 编程比较陌生,所以有时我会错过明显的东西。非常感谢您为我指明了正确的方向! 【参考方案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)
    

【讨论】:

以上是关于使 NSToolbarItem 成为第一响应者的主要内容,如果未能解决你的问题,请参考以下文章

如何使表格单元格中的 UITextField 成为第一响应者?

如何使第一个文本输入成为第一响应者并使用 Eureka 表单显示键盘?

使 UITextField 子视图成为 UITableView 中的第一响应者时出错

iOS 如何使 inputaccessoryview 中的文本视图成为第一响应者?

在alerview被解雇后如何使webview成为第一响应者

当 TextField 成为第一响应者时,`controlTextDidEndEditing` 会被触发