我已经创建了一个自定义的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
答案 0 :(得分:5)
除了其他评论之外,请务必在-prepareForReuse
课程中实施ScoreCell
方法。当要重复使用单元格时会调用它,此时应清除图像。请务必在您的实施中致电[super prepareForReuse];
。这样可以防止单元格被错误的图像重复使用。
答案 1 :(得分:3)
您的图像处理存在两个不相关的问题。 滚动和关闭屏幕将导致单元格加载图像两次(或一百次,具体取决于用户)。
你想要一个
- (UIImage *)boxScoreImageForIndex:(NSInteger)index
方法(懒惰)加载,保持并提供单元格的图像。
您也不想使用imageNamed:
,在您的情况下,它将导致内存使用量超过所需的两倍。请改用imageWithContentsOfFile:
。
答案 2 :(得分:0)
您没有清除上一张图片。当一个单元格出列时,它不会被解除分配。
因此,有时在单元格上绘制的图像在新图像前显示之前的时间。
在drawRect中,您需要清除所有内容。
要么:
CGContextClearRect( context , [self bounds] );
或者在创建单元格时设置clearsContextBeforeDrawing
。