滚动时单元格数据会发生变化

时间:2012-06-18 18:13:22

标签: ios uitableview

我有Xcode 4.3并且该类没有使用ARC。

我创建了一个使用可重复使用单元格的tableview。我试图从其他人那里得到答案,但却找不到合适的答案。

我的表格从数组中获取数据,我使用UILabel显示数据,UIImageView显示数据。

我的代码如下。它很长,但想法是创建并放置UILabel,按钮和图像一次并更改数据。

在滚动时,只有一个单元格发生变化(滚动时我看到不同的数据),其他重复使用的单元格显示来自单元格1的相同数据。

static NSString * CellIdentifier = @"HistoryCellId";

iImage = [UIImage imageNamed: [NSString stringWithFormat:@"%@.png",[(_searching ? _titleArrCopy : _titleArr) objectAtIndex:indexPath.row]]];

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
                                  reuseIdentifier:CellIdentifier];
    iconImage = [[UIImageView alloc] init];
    UIImage * image = [UIImage imageNamed:@"HFcellBG.png"];
    UIImageView * bgImage = [[UIImageView alloc] initWithImage: image];
    cell.backgroundView = bgImage;
    //[iconImage removeFromSuperview];
    iconImage.image = iImage;
    iconImage.frame = CGRectMake(_iconX, 11, 58, 58);
    //iconImage.backgroundColor = [UIColor whiteColor];
    [cell addSubview:iconImage]; // show the image on the side

    titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(_titleX, 3, 212, 25)];
    titleLabel.textAlignment = _nibNameRTL ? UITextAlignmentRight : UITextAlignmentLeft;
    [cell addSubview:titleLabel]; // show a title

    timeLabel = [[UILabel alloc] initWithFrame:CGRectMake(_dateX, 25, 212, 20)];
    timeLabel.textAlignment = _nibNameRTL ? UITextAlignmentRight : UITextAlignmentLeft;
    timeLabel.font = [UIFont systemFontOfSize:15]; // show another data
    [cell addSubview:timeLabel];

    favoriteBtn = [[UIButton alloc] initWithFrame:CGRectMake(_removeX, 48, 66, 23)];
    favoriteBtn.titleLabel.font = [UIFont systemFontOfSize:12];
    [favoriteBtn setTitle:getTextValue(3) forState:UIControlStateNormal];
    [cell addSubview:favoriteBtn];
     // show a button

} 

[iconImage setImage:iImage];

[titleLabel setText:[self parserData:indexPath.row]];

[timeLabel setText:[NSString stringWithFormat:getTextValue(4),[(_searching ? _TimeArrCopy :_TimeArr) objectAtIndex:indexPath.row]]];

if ([[(_searching ? _FavoriteArrCopy : _FavoriteArr) objectAtIndex:indexPath.row] isEqualToString:@"1"]) {
    [favoriteBtn setEnabled:NO];
    [favoriteBtn setBackgroundImage:[UIImage imageNamed:@"HFfavoriteCheckedBtn.png"] forState:UIControlStateNormal];
}
else {
    [favoriteBtn setEnabled:YES];
    [favoriteBtn setBackgroundImage:[UIImage imageNamed:@"HFfavoriteBtn.png"] forState:UIControlStateNormal];
}

favoriteBtn.tag = indexPath.row;
[favoriteBtn addTarget:self action:@selector(addToFavorite:) 
      forControlEvents:UIControlEventTouchUpInside];


//    [cell.favoriteBtn setTitle:getTextValue(3) forState:UIControlStateNormal];
//    [cell.typeImage setImage:iconImage];
//    cell.data = [_dataArr objectAtIndex:indexPath.row];

cell.selectionStyle = UITableViewCellSelectionStyleNone;
// return it
return cell;

}

数据如下所示:我每次都可以看到5个单元格,滚动时我会看到以下行为:

1
2
3
4
5 - the cell 5 changes all the time while scrolling
1 - cell one data again
2
etc

当我检查indexPath.row时,它是正确的行。

出了什么问题?

1 个答案:

答案 0 :(得分:0)

您尝试用于配置单元格的变量在if检查中初始化,该检查很可能不是真的(特别是在滚动之后,当您的单元格实例已经存在时)。您应该访问单元格对象的属性以修改它的状态。

这是Objective-C的一个陷阱,允许您向nil发送消息。

[titleLabel setText:[self parserData:indexPath.row]];

滚动后,titleLabel将为零,并且不会出现错误。

如果您的单元格中有很多自定义UI,我建议创建一个自定义子类,并为您需要自定义的所有子视图添加属性,然后在if(cell == nil)之外使用这些属性块。