Swift 让NSToolbarItem成为第一响应者
在我的MacOS应用程序中,工具栏中有一个Swift 让NSToolbarItem成为第一响应者,swift,macos,first-responder,nstoolbar,nstoolbaritem,Swift,Macos,First Responder,Nstoolbar,Nstoolbaritem,在我的MacOS应用程序中,工具栏中有一个NSSearchField。我想让用户能够通过按CMD+F(与许多苹果应用程序中使用的行为相同)来聚焦它。我创建了一个NSMenuItem,其键相当于CMD+F——它调用以下函数,该函数应该使NSSearchField成为第一响应者 @IBAction func focusFilter(_ sender: NSMenuItem) { self.view.window?.toolbar?.items.first(where: { (item) -&
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
的menuformrrepresentation.view
,得到了相同的结果
如何使
NSToolbarItem
成为第一响应者?感谢您的帮助 正如@Willeke所提到的,正确的解决方案不是使用成为第一响应者,而是使用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)
}
}
从becomeFirstResponder
的文档中:“使用NSWindow makeFirstResponder:方法,而不是此方法,使对象成为第一响应者。永远不要直接调用此方法。”@Willeke,太简单了!我对macOS编程比较陌生,所以有时候我会错过一些显而易见的东西。非常感谢你为我指明了正确的方向!