自定义UITableViewCells重新加载问题

时间:2014-05-12 09:23:21

标签: xcode uitableview custom-cell

每当我删除一个单元格时,之前位于其中的单元格图像不会消失。 例如,单元格使用所有三个图像视图,并被删除并替换为使用其中一个图像视图的单元格。保留了具有前一单元(已删除)的图像的两个图像视图。 当我删除一个单元格时,我从nsmutablearray中删除该对象,并在uitableview上执行reloadData。

我制作了一个类似于

的自定义uitableviewcell
@interface MyPetTableViewCell : UITableViewCell

@property (nonatomic, weak) IBOutlet PetNameLabel *petName;
@property (nonatomic, weak) IBOutlet UIImageView *imageOne;
@property (nonatomic, weak) IBOutlet UIImageView *imageTwo;
@property (nonatomic, weak) IBOutlet UIImageView *imageThree;

@end

我的UITableView设置如下

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"PetCell";
    MyPetTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    PetResponse *petItem = self.petListResponse.PetList[indexPath.row];
    NSString *petNameItem = petItem.PetName;
    NSLog(@"PET NAME : %@",petNameItem);
    NSLog(@"NUMBER OF IMAGES : %lu", (unsigned long)petItem.EncodedImages.count);
    for (int i = 0; i < [petItem.EncodedImages count]; i++) {

        NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:petItem.EncodedImages[i] options:0];
        UIImage *image = [UIImage imageWithData:decodedData];
        if (i == 0) {
            cell.imageOne.image = image;
        } else if (i == 1)
        {
            cell.imageTwo.image = image;
        } else if (i == 2)
        {
            cell.imageThree.image = image;
        }
    }
    cell.petName.text = [NSString stringWithFormat:@"%@ :",petNameItem];
    UIColor *customcolor = [UIColor colorWithRed:11/255.0f green:64/255.0f blue:64/255.0f alpha:0.5f];
    cell.petName.backgroundColor = customcolor;
    cell.petName.layer.cornerRadius = 5;
    cell.petName.numberOfLines = 0;
    [cell.petName sizeToFit];

    [cell setBackgroundColor:[UIColor clearColor]];

    NSLog(@"Returning Cell");
    return cell;
}

2 个答案:

答案 0 :(得分:0)

很难猜出会发生什么,但有一种可能性如下:
表格视图单元格被重复使用。因此,当您将例如子视图添加到表格视图单元格,并且表格视图的相应行被滚动到屏幕外时,单元格(带有子视图!)将被放回到重用池中。如果应显示新的表格行,则可能是从重用池中取出现在未使用的单元格(带有旧的子视图),并显示旧的子视图。 在这种情况下你能做些什么来&#34;准备一个表格视图单元格以便重复使用&#34;,使用方法

- (void)prepareForReuse

在此方法中,您可以删除所有旧的子视图,请参阅docs

答案 1 :(得分:0)

听起来像是细胞重用问题。正如苹果文档所说:

  

tableView中的表视图委托:cellForRowAtIndexPath:should   重复使用单元格时,请始终重置所有内容。

一种可能的解决方案是在分配新图像之前将所有图像设置为nil

   - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        static NSString *CellIdentifier = @"PetCell";
        MyPetTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        PetResponse *petItem = self.petListResponse.PetList[indexPath.row];
        NSString *petNameItem = petItem.PetName;
        NSLog(@"PET NAME : %@",petNameItem);
        NSLog(@"NUMBER OF IMAGES : %lu", (unsigned long)petItem.EncodedImages.count);

        cell.imageOne.image = nil;
        cell.imageTwo.image = nil;
        cell.imageThree.image = nil;

        for (int i = 0; i < [petItem.EncodedImages count]; i++) {

            NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:petItem.EncodedImages[i] options:0];
            UIImage *image = [UIImage imageWithData:decodedData];
            if (i == 0) {
                cell.imageOne.image = image;
            } else if (i == 1)
            {
                cell.imageTwo.image = image;
            } else if (i == 2)
            {
                cell.imageThree.image = image;
            }
        }
        cell.petName.text = [NSString stringWithFormat:@"%@ :",petNameItem];
        UIColor *customcolor = [UIColor colorWithRed:11/255.0f green:64/255.0f blue:64/255.0f alpha:0.5f];
        cell.petName.backgroundColor = customcolor;
        cell.petName.layer.cornerRadius = 5;
        cell.petName.numberOfLines = 0;
        [cell.petName sizeToFit];

        [cell setBackgroundColor:[UIColor clearColor]];

        NSLog(@"Returning Cell");
        return cell;
    }