0

UITableView正在从数组中提取数据。此数组中的项目有一个名为 IsSelected 的属性。我试图UIImageView在单元格contentView中为每个选定的项目添加一个。

但是,UITableView当重用单元格时,会导致我的图像在不应该被重用的单元格上重用。我一生都无法弄清楚我应该如何以不同的方式做这件事。我附上了显示该问题的屏幕截图。如果我继续向上和向下滚动,图像会遍布整个地方:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *SchoolCellIdentifer = @"SchoolCellIdentifier";

    SchoolInfoItem *item = [self.schoolsArray objectAtIndex:indexPath.row];
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SchoolCellIdentifer];

    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:SchoolCellIdentifer];
        cell.contentView.backgroundColor = [BVColors WebDarkBlue];
    }

    cell.textLabel.text = item.Name;

    if ([item.selected isEqualToString:@"1"])
    {
        cell.contentView.backgroundColor = [BVColors WebBlue];
        UIImageView *selectedItemCheckMarkIcon = [[UIImageView alloc] initWithFrame:CGRectMake(300, 13, 17, 17.5)];
        [selectedItemCheckMarkIcon setImage:[UIImage imageNamed:@"check-mark.png"]];
        [cell.contentView addSubview:selectedItemCheckMarkIcon];
    }
    else
    {
        cell.contentView.backgroundColor = [BVColors WebDarkBlue];
    }

    return cell;
}

在此处输入图像描述

4

2 回答 2

1

您需要确保UIImageView从单元格内容视图中删除。在您的代码中,当单元格出列时,imageview 仍位于单元格视图层次结构中。

最好的解决方案是让您的单元格保留对图像视图的引用,并在必要时将其删除。

采取以下措施:

if ([item.selected isEqualToString:@"1"])
{
    cell.contentView.backgroundColor = [BVColors WebBlue];
    cell.myImageView = [[UIImageView alloc] initWithFrame:CGRectMake(300, 13, 17, 17.5)];
    [selectedItemCheckMarkIcon setImage:[UIImage imageNamed:@"check-mark.png"]];
    [cell.contentView addSubview:cell.myImageView];
}
else
{
    [cell.myImageView removeFromSuperview];
    cell.myImageView = nil;
    cell.contentView.backgroundColor = [BVColors WebDarkBlue];
}

请注意在其他情况下删除图像视图。

于 2013-06-20T20:25:30.040 回答
1

您不断添加 UIImageView 作为单元格内容视图的子视图。当表格视图重用单元格时,这不会被删除。如果它不应该出现,您将需要删除它。

你应该selectedItemCheckMarkIcon在你的子类上创建一个属性UITableViewCell。然后在您的子类中有一个方法,您可以在其中相应地设置图像或图像的可见性。

您还可以使用accessoryViewUITableView 上的属性并将 imageView 设置为:

if ([item.selected isEqualToString:@"1"]) {
    cell.contentView.backgroundColor = [BVColors WebBlue];
    UIImageView *selectedItemCheckMarkIcon = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"check-mark.png"]];
    cell.accessoryView = selectedItemCheckMarkIcon;
} else {
    cell.accessoryView = nil;
    cell.contentView.backgroundColor = [BVColors WebDarkBlue];
}

请注意,在这种情况下您不需要设置框架,因为系统会自动为accessoryView.

于 2013-06-20T20:25:44.840 回答