Обновить ячейку таблицы просмотра с анимацией (Swift)
Есть ли способ перезагрузить определенные ячейки UITableView
с несколькими разделами с анимацией?
Я использовал:
self.TheTableView.reloadSections(NSIndexSet(index: 1), withRowAnimation: UITableViewRowAnimation.Right)
Это анимирует все ячейки в этом разделе. Другой вариант - использовать:
self.TheTableView.reloadRowsAtIndexPaths(<#indexPaths: [AnyObject]#>,
withRowAnimation: <#UITableViewRowAnimation#>)
EDIT:
После использования reloadRowsAtIndexPaths
Завершение приложения из-за неперехваченного исключения "NSInternalInconsistencyException", причина: "Недопустимое обновление: недопустимое количество строк в разделе 1. Количество строк, содержащихся в существующем разделе после обновления (5), должно быть равно числу строк содержащиеся в этом разделе перед обновлением (4), плюс или минус количество строк, вставленных или удаленных из этого раздела (0 вставлено, 0 удалено) и плюс или минус количество строк, перемещенных в или из этого раздела (0 перемещено в, 0 выведено).
Попытка найти плавный способ перезагрузки tableview путем добавления объектов в массив.
Вызов TheTableView.reloadData() перед перезагрузкой RowsAtIndexPaths работает, но анимация глючит. Есть ли другой подход?
Ответы
Ответ 1
Почему бы просто не перезагрузить ячейки напрямую? IndexPath содержит раздел и строку, поэтому просто отслеживайте, какой раздел вы хотите перезагрузить и заполнить индексы в этом массиве.
var indexPath1 = NSIndexPath(forRow: 1, inSection: 1)
var indexPath2 = NSIndexPath(forRow: 1, inSection: 2)
self.tableView.reloadRowsAtIndexPaths([indexPath1, indexPath2], withRowAnimation: UITableViewRowAnimation.Automatic)
На основе вашего комментария вы хотите изменить свой массив и обновить tableView в изменениях. Если в этом случае вы должны использовать beginUpdates() и endUpdates() для UITableViews или даже NSFetchedResultsController, чтобы он полностью обрабатывал все анимации обновлений.
self.tableView.beginUpdates()
// Insert or delete rows
self.tableView.endUpdates()
Я бы рекомендовал использовать NSFetchedResultsController, если вы используете Core Data, так как это упрощает весь этот процесс. В противном случае вам придется самостоятельно обрабатывать изменения. Другими словами, если ваш массив изменяется, вам нужно вручную удалить или вставить строки в tableview с помощью beginUpdates() и endUpdates().
Если вы не используете Core Data, изучите этот, чтобы понять, как все это обрабатывается.
Ответ 2
В Swift 3.0
Мы можем перезагрузить определенную строку отдельного раздела в tableview
let indexPath = IndexPath(item: 2, section: 0)
self.tableView.reloadRows(at: [indexPath], with: .automatic)
Ответ 3
Если вы хотите перезагрузить отдельный раздел в swift 3.0, вы можете сделать это:
tableView.reloadSections(IndexSet(integer: 0), with: .automatic)
Ответ 4
определить IndexSet в официальном документе:
Управляет Set
целочисленными значениями, которые обычно используются в качестве индекса введите в Cocoa API. Диапазон действительных целочисленных значений равен в (0, INT_MAX-1). Все, что за пределами этого диапазона, является ошибкой.
поэтому IndexSet устанавливается в индексе, просто помещая некоторые значения Int в []
// for reload one section
tableView.reloadSections([section], with: .automatic)
// or using like this
tableView.reloadSections(IndexSet(integer: section), with: .automatic)
// for reload multi sections
tableView.reloadSections([1, 2, 3, section], with: .automatic)