UITableViewCell повторяется после прокрутки - PullRequest
1 голос
/ 24 июня 2010

Я не уверен, почему мои 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 ]

3 голосов
/ 24 июня 2010

Поскольку вы повторно используете tablecells для правильного управления памятью, как вы должны делать через dequeueReusableCellWithIdentifier :) Таким образом, у вас нет уникальной ячейки для каждой отдельной ячейки, которая вам нужна.Вместо этого у вас есть только 5 или 6, которые повторно используются снова и снова во время прокрутки.

Когда ячейка возвращается в поле зрения, вам необходимо сбросить состояние (то есть обновить информацию, метки, изображения и т. Д.).) каждой ячейки в зависимости от того, какая ячейка была видна.

0 голосов
/ 29 июля 2011

Одна вещь, которую вы можете сделать, это удалить все представления в cell.contentView после создания ячейки или ее удаления из очереди.Кроме того, вы можете создать пользовательскую ячейку с атрибутами для меток, для которых вы можете установить различные значения при прокрутке вниз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...