IOS UITableView reloadRowsAtIndexPaths

У меня есть UITableview, что ленивые загружают изображения всех разных размеров. Когда изображение загружается, мне нужно обновить конкретную ячейку, поэтому я понял, что мне нужно использовать reloadRowsAtIndexPaths. Но когда я использую этот метод, он по-прежнему вызывает метод heightForRowAtIndexPath для каждой отдельной ячейки. Я думал, что вся цель reloadRowsAtIndexPaths заключается в том, что он будет вызывать только heightForRowAtIndexPath для указанной конкретной строки?

Любая идея, почему?

[self.messageTableView beginUpdates];
[self.messageTableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:count inSection:0]] withRowAnimation:UITableViewRowAnimationNone];
[self.messageTableView endUpdates];

Спасибо

Ответ 1

endUpdates запускает пересчет размера содержимого, для которого требуется heightForRowAtIndexPath. Вот как это работает.

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellId = ...;
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId];
    }
    [self tableView:tableView configureCell:cell atIndexPath:indexPath];
    return cell;
}

- (void)tableView:(UITableView *)tableView configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
    //cell configuration logic here
}

Затем, когда вы в настоящее время вызываете reloadRowsAtIndexPaths, вы делаете это вместо этого, а heightForRowAtIndexPath не будет вызываться:

UITableViewCell *cell = [self.messageTableView cellForRowAtIndexPath:indexPath];
[self tableView:self.messageTableView configureCell:cell atIndexPath:indexPath];