2013-05-01 46 views
1

我有一个可重用单元的UITable。每个单元格都有一个依赖于条件的图像。然而,当单元格重新使用时,旧图像显示在新单元格的后面,但总是使用正确的图像。我已经尝试在添加新的子视图之前删除uiimageview,但它没有效果。我的UITableViewCell正在重用以前的单元格UIImage

-(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; 
} 

任何帮助将不胜感激?

+0

滚动后你得到这个问题? – Balu 2013-05-01 13:35:21

回答

0

您始终将imageView添加到单元格的contentView中。如果单元格被重用,将导致单元格中出现多个imageViews。

您可以给imageView一个标签。总是检查单元格的contentView中是否有相同的标签。如果不添加imageView。

UIImageView *achievImg = (UIImageView *)[cell.contentView viewWithTag:55]; 
if(!achievImg){ 
    achievImg = [[UIImageView alloc] init]; 
    achievImg.tag = 55; 
    [cell.contentView addSubView:achievImg]; 
} 
3

问题在于每次调用cellForRowAtIndexPath:时都会创建一个新的imageview。 我纠正你的代码如下:

在这里,我们每进行一次新新小区创建的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; 
} 
+0

完美地工作。我做了类似的尝试,但都没有成功。非常感谢。 – JwL 2013-05-01 22:02:14

+0

苹果[文档](http://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/TableView_iPhone/TableViewCells/TableViewCells.html)是一个很好的阅读以及了解如何tableViewCells的工作,以及如何自定义它们 – 2013-05-02 06:36:10

0

尝试这样,

-(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; 
    } 
相关问题