UITableViewCell缓存其backgroundView属性

时间:2011-01-20 19:55:52

标签: iphone ios uitableview

我有一个UITableView,它使用带有自定义backgroundViews的单元格。我按照建议heretableView:cellForRowAtIndexPath:indexPath:中分配backgroundViews。简而言之,根据UITableViewCell在其UITableView中的位置,我想分配某些backgroundView图像。这是有问题的代码:

UIImage *rowBackground = nil;

if (row == 0 && row == sectionRows - 1) {
    rowBackground = [UIImage imageNamed:@"row_bg_start_and_end.png"];
} else if (row == 0) {
    rowBackground = [UIImage imageNamed:@"row_bg_start.png"];
} else if (row == sectionRows - 1) {
    rowBackground = [UIImage imageNamed:@"row_bg_end.png"];
} else {
    rowBackground = [UIImage imageNamed:@"row_bg.png"];
}

((UIImageView *)cell.backgroundView).image = rowBackground;

这很好用,我看到了我期待的结果。但是,当涉及删除或添加行时,我遇到了一些问题,这些行总是意味着某些行保留了之前的backgroundViews,而不是重新计算它们的位置并更新有问题的视图。

我理解dequeueReusableCellWithIdentifier和为什么发生这种情况的目的。但我不确定如何正确地修复 。我可以通过在屏幕上滚动它们来调用tableView:cellForRowAtIndexPath:indexPath:来正确重新计算行,这样就可以正确地重置backgroundView。

我是否应该在willDisplayCell:forRowAtIndexPath:中设置backgroundView属性?我应该如何处理这种情况?

1 个答案:

答案 0 :(得分:0)

解决问题的最简单方法是在向部分添加新行时重新处理所有可见行的背景图像。

for (UITableViewCell *cell in aTableView.visibleCells)
{
    NSIndexPath *cellIndexPath = [aTableView indexPathForCell:cell];

    /* look at the cell.backgroundImage and if it's not appropriate
    for the indexPath, update it */
}

您可以仔细覆盖插入新行的所有UITableView方法,并且只检查是否需要更新的特定行执行此工作,但我认为这不值得付出努力。