2015-09-08 5 views
6

Я использую QuickBlox Framework для создания чат-приложения. В настоящее время, когда открывается чат, все выглядит великолепно.Цель - C: изменение содержимого UITableView на прокрутке

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

Ниже мой код cellForRowAtIndexPath, если кто-нибудь может сказать мне, что я делаю неправильно

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

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

    if (message.attachments.count > 0) { 

     ImageTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ImageCellIdentifier]; 

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

     return cell; 

    } else { 

     ChatMessageTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ChatMessageCellIdentifier]; 

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

     return cell; 
    } 

} 

EDIT Пожалуйста, смотрите ниже мой метод ImageTableViewCell configureCellWithImage:

- (void) configureCellWithImage:(QBChatMessage*)message { 

    NSString *time = [message.dateSent timeAgoSinceNow]; 

    if ([QBSession currentSession].currentUser.ID == message.senderID) { 

    // Message was sent by me 

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

     if (imageData) { 

     // image is already downloaded 

      dispatch_async(dispatch_get_main_queue(), ^{ 

      UIImage *image = [UIImage imageWithData:imageData]; 
      UIImageView *cellImage = [[UIImageView alloc] init]; 

      [self.backgroundImageView setFrame:CGRectMake(320-155, 10, 140, 140)]; 

      cellImage.frame = CGRectMake(7, 7, 120, 120); 
      [cellImage setContentMode:UIViewContentModeScaleAspectFill]; 

      cellImage.clipsToBounds = YES; 
      cellImage.layer.cornerRadius = 5; 
      cellImage.image = image; 

      self.backgroundImageView.image = aquaBubble; 
      [self.backgroundImageView addSubview:cellImage]; 
      [self.contentView addSubview:self.backgroundImageView]; 

      }); 
     } else { 

    // downloads the image and displays as above 

    } 

    } else { 

    // Message was sent by another user 

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

     if (imageData) { 

      dispatch_async(dispatch_get_main_queue(), ^{ 

      UIImage *image = [UIImage imageWithData:imageData]; 
      UIImageView *cellImage = [[UIImageView alloc] init]; 

      [self.backgroundImageView setFrame:CGRectMake(padding/2, padding+5, 140, 140)]; 

      cellImage.frame = CGRectMake(13, 7, 120, 120); 
      [cellImage setContentMode:UIViewContentModeScaleAspectFill]; 
      cellImage.layer.cornerRadius = 5; 
      cellImage.clipsToBounds = YES; 
      cellImage.image = image; 

      self.timeLabel.frame = CGRectMake(20, self.backgroundImageView.frame.size.height + 20, 80, 20); 
      self.timeLabel.text = [NSString stringWithFormat:@"%@", time]; 
      [self.timeLabel setFont:[UIFont systemFontOfSize:10.0]]; 
      [self.timeLabel setTextColor:[UIColor blackColor]]; 

      [self.contentView addSubview:self.timeLabel]; 

      self.nameAndDateLabel.textAlignment = NSTextAlignmentLeft; 

      QBUUser *sender = [ChatService shared].usersAsDictionary[@(message.senderID)]; 

      NSInteger loginForColor = [sender.login integerValue]; 
      loginForColor = loginForColor % 255; 

      self.nameAndDateLabel.text = [NSString stringWithFormat:@"%@", sender.fullName]; 

      self.backgroundImageView.image = orangeBubble; 
      [self.backgroundImageView addSubview:cellImage]; 
      [self.contentView addSubview:self.backgroundImageView]; 

      }); 

     } else { 

      // downloads the image and displays as above 
     } 

    } 
} 
+2

Вам нужно показать два метода configureCellWithXXX:. – rmaddy

+0

Являются ли ImageCellIdentifier и ChatMEssageCellIdentifier двумя отдельными xib? –

+0

Я добавил метод configureCellWithImage для просмотра. Благодаря! –

ответ

0

ошибка должна быть в функциях configureCellWithImage и configureCellWithMessage.

Я не видел код этих функций, но я уверен, что вы не очистили контент изображения на configureCellWithMessage.

+0

Я добавил метод configureCellWithImage для просмотра. Благодаря! –

+0

Если вы также можете показать configureWithMessage, это должно быть здорово. – piyuj

4

Клетки повторно использовать. Поэтому вы всегда должны устанавливать/перезаписывать все свойства ячейки каждый раз.

Для каждого оператора if, который устанавливает свойство ячейки, должен быть оператор else, который сбрасывает одно и то же свойство - даже если он просто очищает значение.

Также вы должны избегать добавления подвыборок снова и снова при каждом использовании ячейки. У вас есть код, который создает и добавляет представление изображения в ячейку. Но вы продолжаете добавлять новые изображения снова и снова. Просто добавьте его один раз, если потребуется. Если он уже существует, обновите его новым изображением, а не добавьте новый.

+0

Это было для меня - обе вещи, которые вы воспитывали. –

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