Перезагрузите данные таблицы, не очищая ее состояние выбора

У меня есть табличный вид с выбираемыми строками. Когда я перезагружаю представление таблицы, некоторые новые строки могут быть добавлены (или удалены), и некоторые метки в ячейках просмотра таблицы могут измениться. Этого я хочу достичь, позвонив [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 в элементе источника данных и перезагружается только конкретная строка на указанном пути указателя.