Перезагрузка раздела tableView без перезагрузки раздела заголовка - Swift

Я пытаюсь перезагрузить tableView вместо перезагрузки всего tableview, потому что у меня есть текстовое поле в разделе заголовка, и когда я вызываю self.tableView.reloadData(), моя клавиатура закрывается.

Я пробовал код ниже, но я получаю эту ошибку Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'attempt to delete row 5 from section 2 which only contains 4 rows before the update' Итак, пожалуйста, где моя проблема?

    let newCount = self.placeArray.count

    var newIndexPaths = NSMutableArray(capacity: newCount)

    for var i = 0 ; i < newCount ; i++ {
    var indexPath = NSIndexPath(forRow: i, inSection: 2)
        newIndexPaths.addObject(indexPath)
    }

    self.tableView.beginUpdates()
    self.tableView.reloadRowsAtIndexPaths(newIndexPaths as [AnyObject], withRowAnimation: UITableViewRowAnimation.None)
    self.tableView.endUpdates()

Ответы

Ответ 1

Вместо этого вы можете использовать метод UITableView reloadSections.

tableView.reloadSections(NSIndexSet(index: 2), withRowAnimation: .None)

Ответ 2

Swift 3.0.1:

let sectionIndex = IndexSet(integer: 0)

tableView.reloadSections(sectionIndex, with: .none) // or fade, right, left, top, bottom, none, middle, automatic

Ответ 3

Swift 3.1 Xcode 8.3.3 Ответ:)

проблема - каждый раздел включает заголовок, конечно, поэтому раздел:

section = header + footer + rows

ответ - перезагрузка строк напрямую с помощью IndexPath. Пример:

  • Скажем, у вас есть 1 раздел в вашей таблице и "массиве" того, что вы используете в качестве источника данных для таблицы:

    let indexes = (0..<array.count).map { IndexPath(row: $0, section: 0) }

  • Теперь у нас есть массив индексов ячейки, которые мы хотим перезагрузить, поэтому:

    tableView.reloadRows(at: indexes, with: .fade)

Ответ 4

Я не знаю, почему неправильные ответы получают так много голосов.

Замечания:

  • UITableView.reloadData() перезагрузит всю таблицу. Документы о перезагрузке данных

    перезагрузите все данные, которые используются для построения таблицы, включая ячейки, верхние и нижние колонтитулы разделов, массивы индексов и т.д. Для эффективности табличное представление повторно отображает только те строки, которые видны. Он корректирует смещения, если таблица сжимается в результате перезагрузки. Делегат табличных представлений или источник данных вызывает этот метод, когда он хочет, чтобы табличное представление полностью перезагрузило свои данные.

  • UITableView.reloadSections(_ sections: IndexSet, with animation: UITableViewRowAnimation) перезагрузит определенный раздел (включая заголовок раздела и нижний колонтитул раздела). Документы о перегрузочных секциях

  • UITableView.reloadRows(at indexPaths: [IndexPath], with animation: UITableViewRowAnimation) перезагрузит указанные строки. Документы о reloadRows

Поэтому здесь reloadSections здесь не работает. Если данные и статус вашего заголовка не изменились, вызов этого метода не даст различий.

Решение: используйте reloadRows для загрузки строк всех разделов или определенного раздела. Примечание: здесь вы можете просто загрузить видимые строки, другие будут загружены при прокрутке просмотра. Вы также можете обратиться к разделу Получить все indexPaths в разделе, чтобы найти больше решений.

var indexPaths = self.tableView.indexPathsForVisibleRows

/* just roload visible rows of specified section
indexPaths = indexPaths.filter({ (indexPath) -> Bool in
    return indexPath.section == SECTION_INDEX_NEED_TO_RELOAD
})
*/
self.tableView.reloadRows(at: indexPaths!, with: .none)

Ответ 5

Swift 5

Здесь помещается статическая перезагрузка индекса, которая является 1-м индексом, который вы можете изменить согласно вашему требованию.

self.tblView.reloadSections(NSIndexSet(index: 1) as IndexSet, with: .none)