时间:2010-06-24 19:29:44

标签: iphone objective-c cocoa-touch uitableview

我不确定为什么我的UITableViewCell会在用户滚动后重复?

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

        static NSString *CellIdentifier = @"Cell";

     ChartlyCell *cell = (ChartlyCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
     if (cell == nil) {
      //cell = [[[ChartlyCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
      cell = [[[ChartlyCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier andDelegate:self] autorelease];
     }


     ChartlyObject *myChartlyObject;
     myChartlyObject = [self.items objectAtIndex:indexPath.row];

     cell.usernameLabel.text = myChartlyObject.userName;
     cell.bodyLabel.text = myChartlyObject.chart_message;
     [cell.messageLabel setText: myChartlyObject.chart_message];
     cell.timeLabel.text = [Utils toShortTimeIntervalStringFromStockTwits: myChartlyObject.created_at];
     [cell.chartImage loadImageFromURL:[NSURL URLWithString:myChartlyObject.imageThumbnail]];  

        return cell;
    }

这是创建单元格的方式:

-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier andDelegate:(id<NLabelDelegate>)ndelegate{
    if ((self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])) {
        // Initialization code
  CGRect rect;

  rect = CGRectMake(77, 5, 200, 20); //CGRectMake(10, 5, 200, 20);
  usernameLabel = [[UILabel alloc] initWithFrame:rect];
  //usernameLabel.backgroundColor = backgroundColor;
  usernameLabel.font = [Utils getBoldSystemFontWithSize:14];
  usernameLabel.textColor = [UIColor colorWithRed:.368 green:.741 blue:.784 alpha:1];
  [self.contentView addSubview: usernameLabel];

  rect = CGRectMake(277, 5, 38, 20);
  timeLabel = [[UILabel alloc] initWithFrame:rect];
  timeLabel.textAlignment = UITextAlignmentRight;
  //timeLabel.backgroundColor = backgroundColor;
  timeLabel.font = [Utils getBoldSystemFontWithSize:14];
  timeLabel.textColor = [UIColor colorWithRed:.98 green:.65 blue:.01 alpha:1];
  [self.contentView addSubview: timeLabel];

  /*rect = CGRectMake(77, 25, 238, 68); //CGRectMake(10, 50, 238, 68);
  bodyLabel = [[UILabel alloc] initWithFrame:rect];
  bodyLabel.font = [Utils getSystemFontWithSize:10];
  bodyLabel.numberOfLines = 3;
  bodyLabel.lineBreakMode = UILineBreakModeWordWrap;
  bodyLabel.textColor = [UIColor blackColor];
  bodyLabel.backgroundColor = [UIColor clearColor];
  [self.contentView addSubview: bodyLabel];*/

  rect = CGRectMake(77, 25, 238, 68);
  messageLabel = [[NLabel alloc] initWithFrame:rect andDelegate:ndelegate];
  [messageLabel setOpaque:NO];
  [messageLabel setBackgroundColor: [UIColor blackColor]];
  //[messageLabel setTotalheight:68];
  [self.contentView addSubview: messageLabel];

  rect = CGRectMake(13, 10, 48, 48);
  chartImage = [[AsyncImageView alloc]initWithFrame:rect];
  [self.contentView addSubview: chartImage];
    }
    return self;
}

更新 奇怪的是,如果我取消注释bodyLabel块并注释掉messageLabel块,则重复的单元格不再出现。我不确定为什么,仍然希望找到一个决议

更新#2 只有messageLabel会重复出现。所有其他标签都不重复。这是为什么?

2 个答案:

答案 0 :(得分:3)

因为您正在重新使用tablecells进行正确的内存管理,因为您应该通过dequeueReusableCellWithIdentifier进行正确的内存管理:)这样您就不需要为每个单元格提供唯一的单元格。相反,你只有大约5或6个在滚动过程中反复使用。

当单元格返回视图时,您需要根据进入视图的任何单元格重置每个单元格的状态(即更新信息,标签,图像等)。

答案 1 :(得分:0)

您可以做的一件事是在创建单元格或将其出列后删除cell.contentView中的所有视图。或者,您可以创建一个自定义单元格,其中包含可以在向下滚动时设置为不同值的标签属性。