使 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
不会拒绝第一响应者)。
我也尝试使用NSToolbarItem
的menuFormRepresentation.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 中的文本视图成为第一响应者?