UITableViewCell无法正确更新

时间:2011-07-24 01:24:12

标签: iphone objective-c ios uitableview

我已经创建了一个自定义的UITableViewCell,但是在更新单元格的内容时遇到了问题。当表中有多个单元格时,表格未在单元格中绘制正确的图像。每个单元格中的图像应该是唯一的,但是我看到具有相同图像的不同单元格。该表似乎是随机放置细胞。

我已经使用NSLog检查了我的数据源并且名称是正确的。我可以在不使用- (UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier时更正此问题,而是每次在- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath中创建一个新单元格。

有关我可能做错的任何建议吗?请看下面的代码。

- (UITableViewCell *)tableView:(UITableView *)_tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    ScoreCell *cell = (ScoreCell *)[_tableView dequeueReusableCellWithIdentifier:@"CellID"];

    if (cell == nil) 
    {
        cell = [[[ScoreCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellID"] autorelease];
    }

    BoxScore *boxScore = [_gameDayData objectAtIndex:indexPath.row];
    [cell setScoreImage:[UIImage imageNamed:boxScore.name]];

    return cell;
}

ScoreCell.h

@interface ScoreCell : UITableViewCell
{
    UIImage *scoreImage;
}

@property(nonatomic, retain)UIImage *scoreImage;

@end

ScoreCell.m

@implementation ScoreCell

@synthesize scoreImage;

- (void)dealloc
{
    [scoreImage release], scoreImage = nil;
}


- (void)drawRect:(CGRect)rect
{
    [super drawRect:rect];

    [scoreImage drawAtPoint:CGPointMake(5,5)];
}

@end

3 个答案:

答案 0 :(得分:5)

除了其他评论之外,请务必在-prepareForReuse课程中实施ScoreCell方法。当要重复使用单元格时会调用它,此时应清除图像。请务必在您的实施中致电[super prepareForReuse];。这样可以防止单元格被错误的图像重复使用。

答案 1 :(得分:3)

您的图像处理存在两个不相关的问题。 滚动和关闭屏幕将导致单元格加载图像两次(或一百次,具体取决于用户)。

你想要一个

- (UIImage *)boxScoreImageForIndex:(NSInteger)index 

方法(懒惰)加载,保持并提供单元格的图像。

您也不想使用imageNamed:,在您的情况下,它将导致内存使用量超过所需的两倍。请改用imageWithContentsOfFile:

答案 2 :(得分:0)

您没有清除上一张图片。当一个单元格出列时,它不会被解除分配。

因此,有时在单元格上绘制的图像在新图像前显示之前的时间。

在drawRect中,您需要清除所有内容。

要么:

CGContextClearRect( context , [self bounds] );

或者在创建单元格时设置clearsContextBeforeDrawing