改变自定义消息样式,即自定义消息 cell 根据数据改变 UI

针对业务状态来改变自定义消息的展示,例如:报名类型的消息,刚收到时 cell 上显示“去报名”,点击后改变为“已报名”。
发布时间: 2019-07-12 16:53

回答:

解决方案:

1. 标识消息状态:

    调用下面接口对消息设置附加信息,用户标识消息状态,自定义消息 cell 需要通过判断设置的附加信息来修改 UI 展示。
    例如:报名类型的消息,在点击“去报名”按钮时,调用 [[RCIMClient sharedRCIMClient] setMessageExtra:消息的messageId value:"已报名"] 来设置。

/*!

 设置消息的附加信息


 @param messageId   消息ID

 @param value       附加信息

 @return            是否设置成功

 */

- (BOOL)setMessageExtra:(long)messageId value:(NSString *)value;


2. 通知聊天界面修改数据源并刷新:

    在设置完消息的附加信息后,发送通知给聊天界面对象,收到通知后:

        a. 遍历数据源,修改对应 model 的 cellSize,因为只有修改了 cellSize,自定义消息 cell 中返回 CGSize 的方法才能回调,即重新设置 cell 高度,如果不需要改变 cell 高度,可以不修改。

     for (RCMessageModel *model in self.conversationDataRepository) {

             if (model.messageId == 修改了附加信息的消息的messageId) {

                 model.cellSize = CGSizeZero;

             }

         }

             

          b. 主线程调 [self.conversationMessageCollectionView reloadData]; 刷新 UI


3. 自定义消息 cell 根据设置的附加信息来修改 UI

     调用 [self.conversationMessageCollectionView reloadData]; 后,会回调 cell 的 setDataModel 方法,在该方法中判断附加信息,来修改 UI。

     例如:报名类型的消息,在点击“去报名”按钮后,将“去报名”改为“已报名”


- (void)setDataModel:(RCMessageModel *)model {

    RCMessage *msg = [[RCIMClient sharedRCIMClient] getMessage:model.messageId];

    NSString *extra = msg.extra;

    if ([extra isEqualToString:"已报名"]) {

        将“去报名”改为“已报名”的代码

    }


注:

修改消息附加信息的接口只对本地数据库中的消息起作用,不会同步到融云的服务器端,换设备登录或者卸载重写安装 App 都不能获取到设置的附加信息。