我正在为MacOS编写一个基于表格的应用程序(使用NSTableView
)。
在我的应用程序中,我有一个
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
是我想要搜索字段过滤的tableView列的名称。
一切都很好;当我在搜索字段中输入文本时,它会相应地过滤表格。当我尝试以编程方式时,问题出现了"inject"输入我的搜索框。
这是我使用的代码:
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)
含义-我使我的搜索字段成为第一响应者(移动焦点)从表视图到搜索字段),然后将一些文本写入搜索字段的stringValue中。
当我运行应用程序时,我可以看到"焦点"。移动到我的searchField并将文本写入其中,但没有执行过滤。我必须手动按"进入";或者继续在searchField中输入,以使过滤器正确执行。
我如何以编程方式注入文本到我的搜索字段,并立即执行它的过滤功能?
谢谢!
绑定由动作触发。
searchField.sendAction(searchField.action, to: searchField.target)
searchField.action
和searchField.target
可以是nil