使NSToolbarItem成为第一响应者

时间:2018-07-29 13:39:07

标签: swift macos first-responder nstoolbar nstoolbaritem

在我的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的{​​{1}},结果相同。

如何使menuFormRepresentation.view成为第一响应者?任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:-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)
    }
}