Я немного озадачен тем, как перезагрузить данные NSTableView при изменении текста searchField. Я предположил, что мне нужно отфильтровать массив, который tableView использует для заполнения на основе сопоставления строк и вызова tableView.reloadData() внутри controlTextDidChange(), но когда я тестирую код, он не работает. Я предполагаю, что это будет довольно простое исправление, и большая часть информации, которую я нашел по этой теме, была немного сложной. Поэтому я не знаю, насколько простым или сложным на самом деле является решение.
Вот моя функция controlTextDidChange():
func controlTextDidChange(_ obj: Notification) {
noteRecords.filter { $0.title.contains(searchField.stringValue) }
tableView.reloadData()
}
Если бы кто-нибудь мог объяснить, как перезагрузить данные tableViews, используя отфильтрованный массив, при изменении текста searchField, это было бы очень признательно. Также, если проще заменить searchField простым NSTextField, дайте мне знать.
Редактировать
вот функция, которая заполняет 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 { $0.title.localizedCaseInsensitiveContains(query)
}
tableView.reloadData()
}
Более изощренным способом является diffable источник данных.
Мое предложение требует двух массивов одного типа. Массив №1 содержит все элементы и никогда не будет изменен. Массив №2 работает как массив источников данных в numberOfRows и viewFor:row: и заполняется где-то в начале и при поиске. В вашем коде allRecords — это массив источников данных, поэтому используйте другой массив для хранения всех элементов.
Большое спасибо, у меня возникли проблемы, потому что я устанавливал noteRecords = allRecords не в том месте. Как только я установил его внутри блока задач, где я запрашиваю все записи, он сработал
Я немного запутался в том, что вы подразумеваете под использованием
noteRecordsв качестве массива источника данных. Не могли бы вы предоставить более подробную информацию об этой части? Я отредактировал вопрос, чтобы показать функцию tableView, которая заполняет таблицу.