撤回文本消息后,增加“重新编辑”功能。

只针对文本消息,在撤回消息后,增加“重新编辑”,点击后,之前撤回消息的内容会被添加到输入框,类似微信中的效果。
发布时间: 2019-06-21 17:49

回答:

实现思路:


  1. 针对撤回消息,重写 cell,增加“重新编辑”的 UI。

  2. 在聊天页面为撤回消息绑定自定义 cell。

  3. 撤回消息时候,记录撤回消息的内容。

  4. 点击“重新编辑”,将之前记录的撤回消息内容添加到输入框。


实现代码:


  1. 自定义 cell 类:RCDRecallMessageCell.zip,解压后添加到工程中。


  2. 在聊天页面添加必要代码:

引入头文件

  #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];
        }
    }
}