Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 让NSToolbarItem成为第一响应者_Swift_Macos_First Responder_Nstoolbar_Nstoolbaritem - Fatal编程技术网

Swift 让NSToolbarItem成为第一响应者

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) -&

在我的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
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编程比较陌生,所以有时候我会错过一些显而易见的东西。非常感谢你为我指明了正确的方向!