如何以编程方式重置cocoa NSSearchField?

时间:2009-02-15 03:22:27

标签: cocoa

我有一个简单的cocoa用户界面,其中包含项目列表和搜索字段,分别使用NSTableView和NSSearchField实现。数据源和所有绑定都已设置好并且运行良好。我在列表中看到了我的数据,我可以通过在搜索字段中输入字符串来搜索它。当我输入更多文本时,列表中的项目数量会变得越来越小,最终会缩减为我正在搜索的项目。

现在,如何清除搜索字段中的文本并强制列表恢复正常?我可以通过手动清除文本(使用键盘)来实现这一点,但是当我尝试以编程方式执行此操作时,列表中的隐藏项目不会再返回。

我正在使用它:

[searchField setStringValue:@""];

清除搜索字段中的文本,但不会重置列表。

有什么想法吗?是否有一个我在文档中找不到的简单[searchField reset]方法?

4 个答案:

答案 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()
       }
    }
}