Перезагрузите данные таблицы, не очищая ее состояние выбора
У меня есть табличный вид с выбираемыми строками.
Когда я перезагружаю представление таблицы, некоторые новые строки могут быть добавлены (или удалены), и некоторые метки в ячейках просмотра таблицы могут измениться. Этого я хочу достичь, позвонив [tableView reloadData]
.
К сожалению, этот метод также очищает общее представление таблицы, включая выбор. Но мне нужно сохранить выбор.
Итак, как я могу перезагрузить все данные в виде таблицы, сохраняя выбранные выбранные строки?
Ответы
Ответ 1
Вы можете сохранить путь указателя к выбранной строке с помощью:
rowToSelect = [yourTableView indexPathForSelectedRow];
Перед перезагрузкой данных. И после перезагрузки используйте:
[yourTableView selectRowAtIndexPath:rowToSelect animated:YES scrollPosition:UITableViewScrollPositionNone];
Ответ 2
Решение JeroVallis работает для просмотра отдельных таблиц.
Основываясь на его идее, я сделал так, чтобы он работал с несколькими вариантами выбора:
NSArray *selectedIndexPaths = [self.tableView indexPathsForSelectedRows];
[tableView reloadData];
for (int i = 0; i < [selectedIndexPaths count]; i++) {
[tableView selectRowAtIndexPath:selectedIndexPaths[i] animated:NO scrollPosition:UITableViewScrollPositionNone];
}
Ответ 3
Альтернативой, которая имеет некоторые преимущества, является только перезагрузка строк, которые не были выбраны. Быстрый код ниже.
if var visibleRows = tableView.indexPathsForVisibleRows,
let indexPathIndex = visibleRows.index(of: indexPath) {
visibleRows.remove(at: indexPathIndex)
tableView.reloadRows(at: visibleRows, with: .none)
}
Ответ 4
Swift 4.2 Протестировано
Правильный способ обновления выбранных строк после просмотра таблицы перезагрузки:
// Saves selected rows
let selectredRows = tableView.indexPathsForSelectedRows
tableView.reloadData()
// Select row after table view finished reload data on the main thread
DispatchQueue.main.async {
selectredRows?.forEach({ (selectedRow) in
tableView.selectRow(at: selectedRow, animated: false, scrollPosition: .none)
})
}
Ответ 5
Наиболее эффективным способом является сохранение выбранного состояния в модели данных
- Добавить логическое свойство
isSelected
в структуре или классе, который представляет источник данных. - В
cellForRowAt
задано выбранное состояние ячейки в соответствии с свойством. - В
didSelectRow
toggle isSelected
в элементе источника данных и перезагружается только конкретная строка на указанном пути указателя.