实现思路:
-
针对撤回消息,重写 cell,增加“重新编辑”的 UI。
-
在聊天页面为撤回消息绑定自定义 cell。
-
撤回消息时候,记录撤回消息的内容。
-
点击“重新编辑”,将之前记录的撤回消息内容添加到输入框。
实现代码:
-
自定义 cell 类:RCDRecallMessageCell.zip,解压后添加到工程中。
-
在聊天页面添加必要代码:
引入头文件:
#import "RCDRecallMessageCell.h
#import <RongIMLib/RongIMLib.h>
添加属性,记录撤回内容:
//撤回消息的内容
@property (nonatomic, strong) NSString *recallContent;
在 viewDidLoad 中,绑定自定义 cell:
//绑定撤回消息的自定义 cell
[self registerClass:[RCDRecallMessageCell class] forMessageClass:[RCRecallNotificationMessage class]];
重写必要的回调方法:
- (void)recallMessage:(long)messageId {
[super recallMessage:messageId];
//记录撤回消息的内容
RCMessage *recalledMsg = [[RCIMClient sharedRCIMClient] getMessage:messageId];
if ([recalledMsg.content isMemberOfClass:[RCTextMessage class]]) {
RCTextMessage *txtMsg = (RCTextMessage *)recalledMsg.content;
self.recallContent = txtMsg.content;
}
}
- (void)willDisplayMessageCell:(RCMessageBaseCell *)cell atIndexPath:(NSIndexPath *)indexPath {
if ([cell isMemberOfClass: [RCDRecallMessageCell class]] && self.recallContent.length > 0) {
//为撤回消息自定义 cell 添加代理
RCDRecallMessageCell *recallCell = (RCDRecallMessageCell *)cell;
[recallCell setDelegate:self];
//为撤回消息添加之前被撤回消息的内容,以便点击“重新编辑”时候使用
if (self.recallContent.length > 0) {
RCMessageModel *model = self.conversationDataRepository[indexPath.row];
[[RCIMClient sharedRCIMClient] setMessageExtra:model.messageId value:self.recallContent];
[recallCell setDataModel:model];
self.recallContent = @"";
}
}
}
- (void)didTapUrlInMessageCell:(NSString *)url model:(RCMessageModel *)model {
//点击“重新编辑”后的回调方法
if ([model.content isKindOfClass:[RCRecallNotificationMessage class]]) {
//获取之前记录的被撤回消息的内容
RCMessage *message = [[RCIMClient sharedRCIMClient] getMessage:model.messageId];
NSString *content = message.extra;
//如果内容存在,就将内容显示到输入框中
if (content.length > 0) {
[self.chatSessionInputBarControl.inputTextView becomeFirstResponder];
self.chatSessionInputBarControl.inputTextView.text = [NSString stringWithFormat:@"%@%@",self.chatSessionInputBarControl.inputTextView.text,content];
}
}
}