Как перезагрузить и оживить только одну ячейку/строку UITableView?

как я могу перезагрузить и оживить только одну ячейку/строку? Прямо сейчас я загружаю некоторые файлы. Каждый раз, когда файл завершает загрузку, я вызываю его завершенным делегатом и вызываю [tableview reload]. Но тогда вся таблица перезаряжается. И как я могу анимировать таблицу, чтобы она не мигала. Например, эффект затухания или так.

приветствует Макс

Ответ 1

Используйте следующий метод экземпляра UITableView:

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation

Вам нужно указать NSArray of NSIndexPaths, который вы хотите перезагрузить. Если вы просто хотите перезагрузить. Если вы хотите только перезагрузить одну ячейку, вы можете указать NSArray, в котором содержится только NSIndexPath. Например:

NSIndexPath* rowToReload = [NSIndexPath indexPathForRow:3 inSection:0];
NSArray* rowsToReload = [NSArray arrayWithObjects:rowToReload, nil];
[myUITableView reloadRowsAtIndexPaths:rowsToReload withRowAnimation:UITableViewRowAnimationNone];

Вы можете увидеть перечисление UITableViewRowAnimation для всех возможных способов оживления обновления строки. Если вам не нужна анимация, вы можете использовать значение UITableViewRowAnimationNone, как в примере.

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

Ответ 2

Если вам нужно только обновить текст в ячейке tableview.

UITableViewCell *cell = [_myTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:1]];

cell.textLabel.text = [NSString stringWithFormat:@"%i", (int)_targetMaxDistanceSlider.value];

Ответ 3

Apple Document  сделал это с новым синтаксисом

[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];

Ответ 4

Чтобы перезагрузить определенные ячейки в tableView с заданными indexPaths, вам нужно создать массив indexPaths и затем вызвать функцию reloadRowsAtIndexPaths для tableView.

Вот пример:

Свифт 5:

let indexPathsToReload = [indexPath1, indexPath2, indexPath3]
tableView.reloadRows(at: indexPathsToReload, with: .none)

Цель C:

NSArray *indexPaths = @[indexPath1, indexPath2, indexPath3];
[self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];

или же

NSArray *indexPaths = [NSArray arraywithobject:@"indexPath1", @"indexPath2", @"indexPath3",nil];
[self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];

Ответ 5

стриж

Ты можешь использовать

let selectedIndexPath = IndexPath(item:0 , section: 0)
self.tableView.reloadRows(at: [selectedIndexPath], with: .none)

для того, чтобы перезагрузить конкретную ячейку.