NSSearchField 文本更改时如何重新加载 NSTableView 数据

How to reload NSTableView data when NSSearchField text changes

我对如何在 searchField 的文本更改时重新加载 NSTableView 的数据感到有点困惑。我假设我需要过滤 tableView 用于根据字符串匹配和 controlTextDidChange() 内部的调用 tableView.reloadData() 填充自身的数组,但是当我测试代码时它不起作用。我假设这将是一个非常简单的修复,而且我发现的关于该主题的大部分信息都有些复杂。所以我不知道解决方案到底有多简单或复杂

这是我的 controlTextDidChange() 功能:

func controlTextDidChange(_ obj: Notification) {
    noteRecords.filter { [=10=].title.contains(searchField.stringValue) }
    tableView.reloadData()
}

如果有人可以解释如何在 searchField 的文本更改时使用过滤数组重新加载 tableViews 数据,我们将不胜感激。另外,如果用普通的 NSTextField 替换 searchField 更容易,请告诉我。

编辑

这是填充 tableView 的函数:

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
    let note = allRecords[row]
    let cellIdentifier = NSUserInterfaceItemIdentifier(rawValue: "NoteInCloudCell")
    
    if tableColumn == tableView.tableColumns[0] {
        let cell = tableView.makeView(withIdentifier: cellIdentifier, owner: nil) as? NoteInCloudCell
        cell?.noteTitle.stringValue = note.title
        cell?.cloudID.stringValue = note.cloudID
        return cell
    }
    else { return nil }
}

创建与 noteRecords 类型相同的第二个数组并将其命名为 allRecords

将完整的记录集分配给allRecords并使用noteRecords作为数据源数组

controlTextDidChange替换为

func controlTextDidChange(_ obj: Notification) {
    let query = searchField.stringValue
    if query.isEmpty {
        noteRecords = allRecords
    } else {
        noteRecords = allRecords.filter { [=10=].title.localizedCaseInsensitiveContains(query)
    }
    tableView.reloadData()
}

一种更复杂的方法是可区分数据源。