在我的MacOS应用程序中,工具栏中有一个NSSearchField
。我想让用户通过按下CMD+F
(与苹果许多应用程序中使用的行为相同(来集中注意力。我创建了一个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
成为第一响应者?感谢您的帮助!
正如@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)
}
}