我有点困惑于如何在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()
}
一种更复杂的方法是使用不同的数据源。