我有一个简单的cocoa用户界面,其中包含项目列表和搜索字段,分别使用NSTableView和NSSearchField实现。数据源和所有绑定都已设置好并且运行良好。我在列表中看到了我的数据,我可以通过在搜索字段中输入字符串来搜索它。当我输入更多文本时,列表中的项目数量会变得越来越小,最终会缩减为我正在搜索的项目。
现在,如何清除搜索字段中的文本并强制列表恢复正常?我可以通过手动清除文本(使用键盘)来实现这一点,但是当我尝试以编程方式执行此操作时,列表中的隐藏项目不会再返回。
我正在使用它:
[searchField setStringValue:@""];
清除搜索字段中的文本,但不会重置列表。
有什么想法吗?是否有一个我在文档中找不到的简单[searchField reset]方法?
答案 0 :(得分:9)
我明白了。以下代码 工作原理:
[searchField setStringValue:@""]; [[[searchField cell] cancelButtonCell] performClick:self];
答案 1 :(得分:7)
我明白了。以下代码有效:
[searchField setStringValue:@""];
[[[searchField cell] cancelButtonCell] performClick:self];
答案 2 :(得分:3)
[[[searchField cell] cancelButtonCell] performClick:self];
可能有效,但看起来应该有一个“正确”的解决方案。您的表视图是否实际绑定到searchField的值,或者它是否绑定到某个中间对象,当您以编程方式将searchField的内容设置为空字符串时(或者由于绑定的方式在更新时更新)在笔尖设置?
答案 3 :(得分:0)
在输入一些文本后按回车将调用 searchFieldDidStartSearching,然后是 searchFieldDidEndSearching 并清除 textField。
extension NSSearchField {
func resetSearch() {
if let searchFieldCell = self.cell as? NSSearchFieldCell {
searchFieldCell.cancelButtonCell?.performClick(self)
}
}
}
这是我的委托代码
extension ViewController : NSSearchFieldDelegate {
func searchFieldDidEndSearching(_ sender: NSSearchField) {
print("end \(sender.stringValue)")
}
func searchFieldDidStartSearching(_ sender: NSSearchField) {
print("start \(sender.stringValue)")
DispatchQueue.main.async {
// calling resetSearch on main thread preserves focus ring
sender.resetSearch()
}
}
}