Swift - 以编程方式触发 NSSearchField 过滤

Swift - programmatically trigger NSSearchField filtering


我正在为 MacOS 编写基于 table 的应用程序(使用 NSTableView)。

要实现 table 过滤,我使用 bindings

在我的应用程序中,我有一个 NSTableView 绑定到 NSArrayController,还有一个 NSSearchField 绑定到同一个数组控制器。 这是我绑定这些对象的代码:

self.tableView.bind(.content, to: self.arrayController, withKeyPath: "arrangedObjects", options: nil)
let searchField = (Constants.appDelegate.SearchFieldVC.view as? NSSearchField)!  // grab searchField reference
searchField.bind(
    .predicate,
    to: self.arrayController,
    withKeyPath: NSBindingName.filterPredicate.rawValue,
    options: [.predicateFormat: "col CONTAINS[cd] $value"]
)

其中 col 是我希望搜索字段过滤的 table 查看列的名称。

一切正常;当我在搜索字段中键入文本时,它会相应地过滤 table。
当我尝试以编程方式将文本“插入”到我的搜索字段时,问题出现了。
这是我用来执行此操作的代码:

self.view.window?.makeFirstResponder(searchField) // move focus from tableView to searchField
searchField?.stringValue.append(someString)  // inject some text into searchField, expecting immediate table filtering
searchField?.currentEditor()?.moveToEndOfLine(self)

含义 - 我让我的 searchField 成为第一响应者(将“焦点”从 table 视图移动到搜索字段),然后将一些文本写入搜索字段的字符串值。

当我 运行 应用程序时,我可以看到“焦点”移动到我的 searchField 并且文本被写入其中,但没有执行任何过滤。我必须手动按“Enter”或继续在 searchField 中键入,以便过滤器正确执行。

如何以编程方式将文本注入我的 searchField 并立即执行它的过滤功能?
谢谢!

绑定由动作触发。

searchField.sendAction(searchField.action, to: searchField.target)

searchField.actionsearchField.target 可以是 nil.