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



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

这是我的controlTextDidChange()函数:

func controlTextDidChange(_ obj: Notification) {
noteRecords.filter { $0.title.contains(searchField.stringValue) }
tableView.reloadData()
}

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

编辑

这是填充表的函数View:

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 { $0.title.localizedCaseInsensitiveContains(query)
}
tableView.reloadData()
}

一种更复杂的方法是使用不同的数据源。

相关内容

  • 没有找到相关文章

最新更新