iOS UITableView reloadRowsAtIndexPaths

12
我有一个UITableview,可以懒加载各种不同大小的图像。当图像加载时,我需要更新特定的单元格,所以我想出了我需要使用reloadRowsAtIndexPaths方法。但是,当我使用这个方法时,它仍然为每个单元格调用heightForRowAtIndexPath方法。我认为reloadRowsAtIndexPaths的整个目的是只调用指定行的heightForRowAtIndexPath方法,你有什么想法为什么会这样?
[self.messageTableView beginUpdates];
[self.messageTableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:count inSection:0]] withRowAnimation:UITableViewRowAnimationNone];
[self.messageTableView endUpdates];

谢谢您


你尝试过仅使用以下代码吗?[self.messageTableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:count inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; - Ashish P.
你的意思是不是不用将它包裹在beginUpdates和endUpdates中?是的,我试过了,但它仍然尝试重新计算每个单元格的高度。这真的很烦人,因为我期望它只为这个特定的单元格调用heightForRowAtIndexPath。 - Jesse
我是否正确地认为它只应该为这一个单元格调用heightForRowAtIndexPath方法?还是它会为表中的每个单元格再次调用此方法? - Jesse
尝试这段代码:cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellIdentifier"]; 它将为每一行初始化一个新的单元格对象,而不是重用可见行。 - Ashish P.
尝试过了,但我的表视图什么都没有显示。我的单元格有自定义类,不确定是否是这个原因,但按照这种方式加载时界面上什么也没有显示... - Jesse
显示剩余2条评论
1个回答

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。而是每当我进行任何类型的reload时,heightForRowAtIndexPath都会为UITableView中的每个单元格调用。我停止使用beginUpdates和endUpdates,但这仍然发生。 - Jesse
@Jesse 你可能没有理解我的意思。如果你将单元格的配置逻辑从cellForRowAtIndexPath中移出到一个独立的方法中(你可以从cellForRowAtIndexPath中调用该方法),你可以直接调用该方法来更新单元格的配置,而不是使用reloadRowsAtIndexPaths(间接调用cellForRowAtIndexPath),从而绕过表视图的重新加载行为,这涉及重新计算内容大小(间接调用heightForRowAtIndexPath)。 - Timothy Moose
嗨,Tim。我调用了configure cell方法,但是出现了自动布局约束冲突,它说我的单元格高度为300,而我的图片高度大于300。似乎调用configure cell不会更新单元格的高度。有没有办法通知表视图更新高度?我尝试在再次调用configure cell之前手动调用heightForRow方法。 - Zhang
@张,你需要重新加载行以使表视图更新其高度。 - Timothy Moose
也许最好的解决方案是服务器返回单元格中每张图片的宽度和高度。Web开发人员的逻辑与iOS相反,他们将内容提供给浏览器,浏览器会自动调整单元格大小以适应其内容的高度,而iOS需要开发人员在生成内容之前提供高度 =/ - Zhang
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接