我的 UITableViewCell 正在重用以前的单元格 UIImage
Posted
技术标签:
【中文标题】我的 UITableViewCell 正在重用以前的单元格 UIImage【英文标题】:My UITableViewCell is reusing a previous cells UIImage 【发布时间】:2013-05-01 13:15:32 【问题描述】:我有一个重用单元格的 UITable。每个单元格都有一个取决于条件的图像。始终使用正确的图像,但是当重新使用单元格时,旧图像显示在新图像后面。我曾尝试在添加新子视图之前删除 uiimageview,但它没有效果。
-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *simpTableIden = @"simpTableIden";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpTableIden];
if (cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpTableIden];
NSUInteger row = [indexPath row];
cell.textLabel.text = [[self.achievements objectForKey:[keys objectAtIndex:row]] objectForKey:@"name"];
CGRect picFrame = CGRectMake(cell.frame.size.width-cell.frame.size.height, 0, cell.frame.size.height, cell.frame.size.height);
UIImage *greyDot = [UIImage imageNamed:@"greyDot.png"];
UIImage *whiteDot = [UIImage imageNamed:@"whiteDot.png"];
UIImageView *achievImg = [[UIImageView alloc] init];
tableView.backgroundColor = [UIColor clearColor];
achievImg.frame=picFrame;
if ([[[self.achievements objectForKey:[keys objectAtIndex:row]] objectForKey:@"achieved"] boolValue])
achievImg.image = whiteDot;
else
achievImg.image = greyDot;
[achievImg removeFromSuperview];
[cell.contentView addSubview:achievImg];
return cell;
任何帮助将不胜感激?
【问题讨论】:
滚动后出现此问题? 【参考方案1】:问题是每次调用cellForRowAtIndexPath:
时,您都会创建一个新的图像视图。
我将您的代码更正如下:
这里我们为每个新的新单元格创建一个 imageView 并在每次调用 cellForRowAtIndexPath:
时替换它的图像:
-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *simpTableIden = @"simpTableIden";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpTableIden];
UIImageView *achievImg = nil;
if (cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpTableIden];
//New Cell ... Create Image view
achievImg = [[UIImageView alloc] init];
achievImg.tag = 10;
[cell.contentView addSubview:achievImg];
else
//Old cell...get previously createdd imageview
achievImg = (UIImageView*)[cell.contentView viewWithTag:10];
NSUInteger row = [indexPath row];
cell.textLabel.text = [[self.achievements objectForKey:[keys objectAtIndex:row]] objectForKey:@"name"];
CGRect picFrame = CGRectMake(cell.frame.size.width-cell.frame.size.height, 0, cell.frame.size.height, cell.frame.size.height);
UIImage *greyDot = [UIImage imageNamed:@"greyDot.png"];
UIImage *whiteDot = [UIImage imageNamed:@"whiteDot.png"];
tableView.backgroundColor = [UIColor clearColor];
achievImg.frame=picFrame;
if ([[[self.achievements objectForKey:[keys objectAtIndex:row]] objectForKey:@"achieved"] boolValue])
achievImg.image = whiteDot;
else
achievImg.image = greyDot;
//You don't need this because it doesn't have a superview in the first place..it's new
//[achievImg removeFromSuperview];
return cell;
【讨论】:
完美运行。我确实尝试过类似的事情但没有成功。非常感谢。 Apple docs 在了解 tableViewCells 如何工作以及如何自定义它们方面也是一本不错的读物【参考方案2】:试试这样,
-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *simpTableIden = @"simpTableIden";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpTableIden];
if (cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpTableIden];
NSUInteger row = [indexPath row];
cell.textLabel.text = [[self.achievements objectForKey:[keys objectAtIndex:row]] objectForKey:@"name"];
CGRect picFrame = CGRectMake(cell.frame.size.width-cell.frame.size.height, 0, cell.frame.size.height, cell.frame.size.height);
UIImage *greyDot = [UIImage imageNamed:@"greyDot.png"];
UIImage *whiteDot = [UIImage imageNamed:@"whiteDot.png"];
UIImageView *achievImg = [[UIImageView alloc] init];
tableView.backgroundColor = [UIColor clearColor];
achievImg.frame=picFrame;
if ([[[self.achievements objectForKey:[keys objectAtIndex:row]] objectForKey:@"achieved"] boolValue])
achievImg.image = whiteDot;
else
achievImg.image = greyDot;
[achievImg removeFromSuperview];
[cell.contentView addSubview:achievImg];
return cell;
【讨论】:
【参考方案3】:您总是将 imageView 添加到单元格的 contentView 中。如果单元格被重用,将导致单元格中出现多个图像视图。
你可以给 imageView 一个标签。始终检查单元格的 contentView 中是否有相同的标签。如果不添加 imageView。
UIImageView *achievImg = (UIImageView *)[cell.contentView viewWithTag:55];
if(!achievImg)
achievImg = [[UIImageView alloc] init];
achievImg.tag = 55;
[cell.contentView addSubView:achievImg];
【讨论】:
以上是关于我的 UITableViewCell 正在重用以前的单元格 UIImage的主要内容,如果未能解决你的问题,请参考以下文章
UITableViewCell 可重用性问题。修改一个单元格正在影响其他单元格
UITableViewCell中的UIButton标题在重用时会发生变化