2015-09-08 2 views
0

Моего приложение чата использует следующую cellForRowAtIndexPath настроить историю диалога чата для пользователя:Пользовательские TableViewCells Не повторное использование

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

{ 

QBChatMessage *message = [[ChatService shared] messagsForDialogId:self.dialog.ID][indexPath.row]; 

    if (message.attachments.count > 0) { 

     ImageTableViewCell *cell = [[ImageTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ImageCellIdentifier message:message]; 

    [cell fillWithStickerMessage:message]; 
    cell.backgroundColor = [UIColor whiteColor]; 

    } 

return cell; 

} 

Вот init метода в моем ImageTableViewCell.m файле.

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier message:(QBChatMessage *)message { 

    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 

    if (self) { 

     NSData *imageData = [FTWCache objectForKey:[NSString stringWithFormat:@"%@", [message.attachments[0] valueForKey:@"ID"]]]; 

     if (imageData) { 

      UIImage *image = [UIImage imageWithData:imageData]; 
      [self.cellImage setImage:image]; 

     } else { 

      for(QBChatAttachment *attachment in message.attachments){ 
       // download file by ID 

       [QBRequest TDownloadFileWithBlobID:[attachment.ID integerValue] successBlock:^(QBResponse *response, NSData *fileData) { 

        [FTWCache setObject:fileData forKey:[NSString stringWithFormat:@"%@", attachment.ID]]; 

        UIImage *image = [UIImage imageWithData:imageData]; 
        [self.cellImage setImage:image]; 

       } statusBlock:^(QBRequest *request, QBRequestStatus *status) { 
        // handle progress 
       } errorBlock:^(QBResponse *response) { 
        NSLog(@"error: %@", response.error); 
       }]; 
      } 
     } 

     self.nameAndDateLabel = [[UILabel alloc] init]; 
     self.timeLabel = [[UILabel alloc] init]; 
     self.cellImage = [[UIImageView alloc] init]; 

     self.cellImage.opaque = YES; 

     if ((IS_IPHONE_4) || (IS_IPHONE_5)){ 
      [self.nameAndDateLabel setFrame:CGRectMake(20, 5, 300, 20)]; 
     } else if (IS_IPHONE_6) { 
      [self.nameAndDateLabel setFrame:CGRectMake(20, 5, 355, 20)]; 
     } else if (IS_IPHONE_6_PLUS) { 
      [self.nameAndDateLabel setFrame:CGRectMake(20, 5, 394, 20)]; 
     } 

     [self.nameAndDateLabel setFont:[UIFont boldSystemFontOfSize:15]]; 
     [self.nameAndDateLabel setTextColor:[UIColor lightGrayColor]]; 
     [self.contentView addSubview:self.nameAndDateLabel]; 

     self.backgroundImageView = [[UIImageView alloc] init]; 
     [self.backgroundImageView setFrame:CGRectZero]; 
     [self.backgroundImageView addSubview:self.cellImage]; 
     [self.contentView addSubview:self.backgroundImageView]; 

    } 

    return self; 

} 

Проблема заключается в том, что при прокрутке табличной клетка постоянно инициализируется в initWithStyle в файле ImageViewCell.m. Разве это не должно произойти, если ячейка уже не создана? Что я делаю не так?

ответ

1

Вы пропустили звонок в cellForRowAtIndexPath для

- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier 
          forIndexPath:(NSIndexPath *)indexPath 

или

- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier 

в зависимости от того, зарегистрировал ли ваше UITableViewCell перо или класс.

Так, например, в cellForRowAtIndexPath вы могли бы сделать:

ImageTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ImageCellIdentifier]; 
if (cell == nil) { 
    cell = [[ImageTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ImageCellIdentifier message:message]; 
} 
+0

Учитывая ошибку в коде OP, этот ответ, вероятно, должен показать, как это на самом деле должно быть использовано. – rmaddy

+0

Извините, я в замешательстве. Какова была моя первоначальная ошибка в коде, который я опубликовал? –

+0

Вам нужно попытаться удалить ячейку перед созданием нового. См. Подробности: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableView_Class/index.html#//apple_ref/occ/instm/UITableView/dequeueReusableCellWithIdentifier: – onnoweb

Смежные вопросы