Обновить ячейку таблицы просмотра с анимацией (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)