重用UITableViewCell后出错

时间:2014-05-14 07:47:48

标签: ios objective-c uitableview

我有一个带有两个UIImageView

的原型UITableViewCell

我像这样创建单元格:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
        static NSString *CellIdentifier = @"PollCell";
        PollListVO * pollist = [self.pollListArray objectAtIndex:indexPath.section];
        PollCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        PollVO *pollVO = [pollist.polls objectAtIndex:indexPath.row];
        cell.pollVO = pollVO;
        return cell;
}

在单元格中我有一个方法:

- (void) setPollVO:(PollVO *)pollVO
{
    NSString *iconName;
    if ([pollVO.author isEqualToString:@"Иванов"]) {
        iconName = @"image_common_from_mayor.png";
    } else if ([pollVO.author isEqualToString:@"Петров"]) {
        iconName = @"image_common_from_government.png";
    } else if ([pollVO.author isEqualToString:@"Сидоров"]) {
        iconName = @"image_common_from_edition.png";
    }
    if (iconName) {
        _mainIconImageView.image = [UIImage imageNamed:iconName];
    }
    _titleLabel.text = pollVO.title;
    _detailLabel.text = pollVO.author;
    _questionLabel.text = [[self class] stringWithQuestionsQuantity:pollVO.questionsQuantity];
    _bounceLabel.text = [[self class] stringWithPointValue:pollVO.points];
    _bounceDetailLabel.text = [SCUtils stringPointsCount:pollVO.points];
    _pollVO = pollVO;
}

并且在布局子视图中,我根据数据更改元素的位置和隐藏属性;

问题是,在我滚动单元格之后 - 我在前一个单元格的单元格上有图像 - 但它不应该出现在这个特定的单元格上。因此,在重复使用单元格之后,它有时会从其他单元格中获取图标。

错误在哪里?我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

问题在于,当您重复使用单元格时,它会保留之前设置的图像(以及所有属性)。为了纠正这种行为,您可以每次将图像设置为nil:

if (iconName) {
    _mainIconImageView.image = [UIImage imageNamed:iconName];
}else{
    _mainIconImageView.image = nil;
}

或者在PollCell.m中,覆盖准备重用:

- (void) prepareForReuse{
    [super prepareForReuse];
    self.image = nil;
}

答案 1 :(得分:2)

如果UITableView被重用,它将保持其以前的状态。每次重复使用单元格以覆盖所有属性时,您必须重置所有视图和属性。

例如,对于您的图片,您可以将代码更改为:

if (iconName) {
    _mainIconImageView.image = [UIImage imageNamed:iconName];
}else {
    _mainIconImageView.image = nil
}