
IM即时通讯
安全可靠、全球互通

实时音视频
流畅稳定、省钱省力
回答:
1. 在 cell 显示的时候,将 SDK 默认的图标移除,在对应位置添加文本“已读”或“未读”
2. 需要监听消息发送状态更新的通知,更新 cell
5.x 版本:http://doc.rongcloud.cn/im/IOS/5.X/ui/function/message/receipt#custom
2.x 和 4.x 版本:
重写 cell 即将显示的方法,修改 UI
- (void)willDisplayMessageCell:(RCMessageBaseCell *)cell atIndexPath:(NSIndexPath *)indexPath { RCMessageModel *model = [self.conversationDataRepository objectAtIndex:indexPath.row]; if ([cell isKindOfClass:[RCTextMessageCell class]] && model.conversationType == ConversationType_PRIVATE) { if (model.content) { for (UIView *view in [((RCMessageCell *)cell).messageHasReadStatusView subviews]) { [view removeFromSuperview]; } UILabel *hasReadView = [[UILabel alloc] initWithFrame:CGRectMake(-18, 5, 30, 20)]; hasReadView.textAlignment = NSTextAlignmentRight; hasReadView.font = [UIFont systemFontOfSize:12]; hasReadView.textColor = [UIColor blackColor]; ((RCMessageCell *)cell).messageHasReadStatusView.hidden = NO; if (model.sentStatus == SentStatus_READ) { CGRect hasReadViewFrame = hasReadView.frame; hasReadViewFrame.origin.y -= 19; hasReadView.frame = hasReadViewFrame; hasReadView.text = @"已读"; [((RCMessageCell *)cell).messageHasReadStatusView addSubview:hasReadView]; } else if (model.sentStatus == SentStatus_SENT) { hasReadView.text = @"未读"; [((RCMessageCell *)cell).messageHasReadStatusView addSubview:hasReadView]; } } } else { for (UIView *view in [((RCMessageCell *)cell).messageHasReadStatusView subviews]) { [view removeFromSuperview]; } } }
2. 监听消息发送状态更新的通知,执行刷新 cell 的方法:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(messageCellUpdateSendingStatusEvent:) name:KNotificationMessageBaseCellUpdateSendingStatus object:nil];
- (void)messageCellUpdateSendingStatusEvent:(NSNotification *)notification { RCMessageCellNotificationModel *notifyModel = notification.object; if (notifyModel && ![notifyModel.actionName isEqualToString:CONVERSATION_CELL_STATUS_SEND_PROGRESS]) { [self reloadMessageCell:notifyModel.messageId]; } }
- (void)reloadMessageCell:(long)messageId { __weak typeof(self) __weakself = self; dispatch_async(dispatch_get_main_queue(), ^{ for (int i = 0; i < __weakself.conversationDataRepository.count; i++) { RCMessageModel *model = (__weakself.conversationDataRepository)[i]; if (messageId == model.messageId) { NSIndexPath *indexPath = [NSIndexPath indexPathForItem:i inSection:0]; [__weakself hideCellReceiptView:indexPath withMessageModel:model]; break; } } }); }
- (void)hideCellReceiptView:(NSIndexPath *)indexPath withMessageModel:(RCMessageModel *)model { UICollectionViewCell *__cell = [self.conversationMessageCollectionView cellForItemAtIndexPath:indexPath]; [self.conversationMessageCollectionView reloadItemsAtIndexPaths:@[ indexPath ]]; //如果是空说明被回收了,重新dequeue一个cell,这里用来解决已读人数闪的问题 if (__cell) { if ([__cell isKindOfClass:[RCMessageCell class]]) { dispatch_async(dispatch_get_main_queue(), ^{ ((RCMessageCell *)__cell).receiptCountLabel.hidden = YES; }); } } }
注:
上面代码已单聊文本消息为例,如需多更多消息类型修改,可以自行添加判断修改 UI。