Ответ 1
Вместо этого вы можете использовать метод UITableView
reloadSections
.
tableView.reloadSections(NSIndexSet(index: 2), withRowAnimation: .None)
Я пытаюсь перезагрузить 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()
Вместо этого вы можете использовать метод UITableView
reloadSections
.
tableView.reloadSections(NSIndexSet(index: 2), withRowAnimation: .None)
Swift 3.0.1:
let sectionIndex = IndexSet(integer: 0)
tableView.reloadSections(sectionIndex, with: .none) // or fade, right, left, top, bottom, none, middle, automatic
Swift 3.1 Xcode 8.3.3 Ответ:)
проблема - каждый раздел включает заголовок, конечно, поэтому раздел:
ответ - перезагрузка строк напрямую с помощью IndexPath. Пример:
Скажем, у вас есть 1 раздел в вашей таблице и "массиве" того, что вы используете в качестве источника данных для таблицы:
let indexes = (0..<array.count).map { IndexPath(row: $0, section: 0) }
Теперь у нас есть массив индексов ячейки, которые мы хотим перезагрузить, поэтому:
tableView.reloadRows(at: indexes, with: .fade)
Я не знаю, почему неправильные ответы получают так много голосов.
Замечания:
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)
Здесь помещается статическая перезагрузка индекса, которая является 1-м индексом, который вы можете изменить согласно вашему требованию.
self.tblView.reloadSections(NSIndexSet(index: 1) as IndexSet, with: .none)