2013-10-25 15 views
12

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

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

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

Спасибо

+0

вы пробовали используя только .. [self.messageTableView reloadRowsAtIndexPaths: [NSArray arrayWithObject: [NSIndexPath indexPathForRow: count inSection: 0]] withRowAnimation: UITableViewRowAnimationNone]; –

+0

Вы имеете в виду вместо того, чтобы обернуть его в beginUpdates и endUpdates? Да, я пробовал это, и он по-прежнему пытается переделать высоту для каждой отдельной ячейки. На самом деле раздражает, поскольку я ожидаю, что он вызовет heightForRowAtIndexPath только для этой конкретной ячейки. – Jesse

+0

Правильно ли я полагаю, что для этой ячейки нужно только назвать heightForRowAtIndexPath? Или он снова вызывает этот метод для каждой ячейки таблицы? – Jesse

ответ

7

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]; 
+1

Проблема не в cellForRowAtIndexPath. Это тот факт, что heightForRowAtIndexPath вызывается для каждой отдельной ячейки в UITableView, когда я делаю любой тип перезагрузки. Я прекратил использовать beginUpdates и endUpdates, но это все равно происходит – Jesse

+0

@Jesse Возможно, вы пропустили мою точку. Если вы переместите логику конфигурации вашей ячейки из 'cellForRowAtIndexPath' в автономный метод (который вы вызываете из' cellForRowAtIndexPath', вы можете обновить конфигурацию ячейки, вызвав метод напрямую, вместо использования 'reloadRowsAtIndexPaths' (который косвенно вызывает' cellForRowAtIndexPath'), тем самым минуя поведение перезагрузки табличного представления, которое включает в себя пересчет размера контента (который косвенно вызывает 'heightForRowAtIndexPath'). –

+0

Эй, Тим. Я вызвал метод сокета configure, но у меня возник конфликт ограничений автоопределения, он говорит, что высота моей ячейки составляет 300, тогда как моя высота изображения больше 300. Кажется, что вызов ячейки configure не обновляет высоту ячейки. Есть ли способ сообщить табличное представление, чтобы обновить высоту?Я попытался вручную вызвать метод heightForRow прямо перед вызовом configure cell снова. – Zhang

Смежные вопросы