ios - 目标 - C : UITableView Content Changing on Scroll

标签 ios objective-c uitableview quickblox

我正在使用 QuickBlox 框架构建一个聊天应用程序。目前,当聊天 View 打开时,一切看起来都很棒。

但是,当用户开始上下滚动聊天记录时,一些单元格开始发生变化(例如,它们将显示一张应该放在不同行中的图像)。

下面是我的 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;
    }

}

编辑 请看下面我的 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
        }

    }
}

最佳答案

细胞得到重用。因此,您每次都必须始终设置/重置单元格的所有属性。

对于每个设置单元格属性的 if 语句,必须有一个 else 语句重置相同的属性 - 即使它只是清除值。

此外,您还必须避免在每次使用单元格时反复添加 subview 。您拥有创建 ImageView 并将其添加到单元格的代码。但是您不断地添加新的 ImageView 。如果需要,只需添加一次。如果它已经存在,请使用新图像更新它而不是添加新图像。

关于ios - 目标 - C : UITableView Content Changing on Scroll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32464808/

相关文章:

ios - 如何在 iOS 中使用 'Container View'?

ios - 从 UILongPressRecognizer 中确定用于 segue 的单元格

ios - 如何为 TableView 部分创建两种数据类型的数组 - 无法通过下标分配 : Subscript is a get-only

ios - 实现不同的单元类型

ios - 如何点击 UITableViewCell 中的 UIButton 并转换到新的 View Controller ,并向其传递信息?

ios - 我如何从这个数组中快速获取菜单

ios - 测量两个短音频相似度的最简单算法

iphone - 当 UITableView 滚动时如何取消选择 UITableViewCell?

ios - UIView 是 UIScrollview 的子项,但是当我放大或缩小时,UIView 不会停留在相对于 ScrollView 中图像的正确位置

objective-c - TableView 日期降序排列 swift