跳到主要内容

页面事件监听

监听会话列表页面事件

您可以设置会话列表操作监听,实现自定义需求。以下列出了 RCConversationListViewController.h 提供的常用事件,您也可以直接参考 IMKit 源码,查看所有事件。

即将显示会话 Cell

重写 RCConversationListViewController 的此方法,可修改 Cell 的一些显示属性,如对会话列表自带 Cell 样式如字体颜色,字体大小进行修改。不建议修改 Cell 的布局。如果对 UI 比较高的定制需求,建议自定义会话列表中的会话 Cell。

- (void)willDisplayConversationTableCell:(RCConversationBaseCell *)cell atIndexPath:(NSIndexPath *)indexPath;
参数类型说明
cellRCConversationBaseCell即将显示的 Cell
indexPathNSIndexPath该 Cell 对应的会话 Cell 数据模型在数据源中的索引值

点击会话 Cell

重写 RCConversationListViewController 的此方法,可跳转到您自定义的会话页面。

- (void)onSelectedTableRow:(RCConversationModelType)conversationModelType
conversationModel:(RCConversationModel *)model
atIndexPath:(NSIndexPath *)indexPath;
参数类型说明
conversationModelTypeRCConversationModelType当前点击的会话的 Model 类型
modelRCConversationModel当前点击的会话的 Model
indexPathNSIndexPath当前会话在列表数据源中的索引值

点击会话头像

会话列表中的每个会话项目上均会显示一个头像图标,即会话头像(不是聊天页面内中消息列表中的头像)。单聊会话显示对方用户头像,群聊会话显示群组头像,聚合会话显示默认头像或应用程序主动设置的头像。

重写 RCConversationListViewController 的此方法,可自定义处理该事件。

- (void)didTapCellPortrait:(RCConversationModel *)model;
参数类型说明
modelRCConversationModel会话 Cell 的数据模型

长按会话头像

会话列表中的每个会话项目上均会显示一个头像图标,即会话头像(不是聊天页面内中消息列表中的头像)。单聊会话显示对方用户头像,群聊会话显示群组头像,聚合会话显示默认头像或应用程序主动设置的头像。

重写 RCConversationListViewController 的此方法,可自定义处理该事件。

- (void)didLongPressCellPortrait:(RCConversationModel *)model;
参数类型说明
modelRCConversationModel会话 Cell 的数据模型

删除会话

重写 RCConversationListViewController 的此方法,可自定义处理该事件。

- (void)didDeleteConversationCell:(RCConversationModel *)model;
参数类型说明
modelRCConversationModel会话 Cell 的数据模型

即将加载数据源

重写 RCConversationListViewController 的此方法,可修改、添加、删除数据源的元素来定制显示的内容,会话列表会根据您返回的修改后的数据源进行显示。数据源中存放的元素为会话 Cell 的数据模型,即 RCConversationModel 对象。

- (NSMutableArray *)willReloadTableData:(NSMutableArray *)dataSource;
参数类型说明
dataSourceNSMutableArray即将加载的增量数据源
提示

dataSource 为增量数据,conversationListDataSource += dataSource。如果需要更改全量数据的内容,可以更改 conversationListDataSource

即将更新未读消息数

当收到消息或删除会话时,会调用此回调。重写 RCConversationListViewController 的此方法,可以执行未读消息数相关的操作。

- (void)notifyUpdateUnreadMessageCount;
提示

该方法在非主线程回调,如果想在本方法中操作 UI,请手动切换到主线程。

在会话列表中收到新消息

重写 RCConversationListViewController 的此方法,可自定义处理该事件。

- (void)didReceiveMessageNotification:(NSNotification *)notification;
参数类型说明
notificationNSNotification收到新消息的 notification。notification 的 object 为 RCMessage 消息对象。userInfo 为 NSDictionary 对象,其中 key 值为 @"left",value 为还剩余未接收的消息数的 NSNumber 对象。
提示

SDK 在此方法中针对消息接收有默认的处理(如刷新等),如果重写此方法,请注意调用 super。

监听会话页面事件

您可以设置会话页面操作监听,实现自定义需求。以下列出了 RCConversationViewController.h 提供的常用事件,您也可以直接参考 IMKit 源码,查看所有事件。

输入框内容发生变化

重写 RCConversationViewController 的此方法,可自定义处理该事件。

- (void)inputTextView:(UITextView *)inputTextView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text;
参数类型说明
inputTextViewUITextView文本输入框
rangeNSRange当前操作的范围
textNSString插入的文本

输入框高度发生变化

重写 RCConversationViewController 的此方法,可自定义处理该事件。

- (void)chatInputBar:(RCChatSessionInputBarControl *)chatInputBar shouldChangeFrame:(CGRect)frame;
参数类型说明
chatInputBarRCChatSessionInputBarControl输入工具栏
frameCGRect输入工具栏最终需要显示的 Frame
提示

如重写此方法,请先调用父类方法。

准备发送消息

准备向外发送消息时会触发该回调(不支持通过插件发送的位置消息、小视频、融云贴纸表情消息)。重写 RCConversationViewController 的此方法,可自定义处理该事件。此回调的返回值不为 nil 时,SDK 会对外发送返回的消息内容。

- (RCMessageContent *)willSendMessage:(RCMessageContent *)messageContent;
参数类型说明
messageContentRCMessageContent消息内容
提示

通过位置插件、名片插件、融云贴纸表情发送的消息不会触发该回调。如果希望对消息进行拦截、过滤、修改等操作,建议使用 RCIMMessageInterceptor 协议设置拦截器,详见拦截消息

发送消息完成

重写 RCConversationViewController 的此方法,可自定义处理该事件。

- (void)didSendMessage:(NSInteger)status content:(RCMessageContent *)messageContent;
参数类型说明
statusNSInteger发送状态,0表示成功,非0表示失败
messageContentRCMessageContent消息内容

取消消息发送

重写 RCConversationViewController 的此方法,可自定义处理该事件。

- (void)didCancelMessage:(RCMessageContent *)messageContent;
参数类型说明
messageContentRCMessageContent消息内容

即将将消息插入数据源

在消息准备插入数据源的时候会回调。重写 RCConversationViewController 的此方法,可对消息进行过滤和修改操作。 如果此回调的返回值不为 nil,SDK 会将返回消息实体对应的消息 Cell 数据模型插入数据源,并在会话页面中显示。

- (RCMessage *)willAppendAndDisplayMessage:(RCMessage *)message;
参数类型说明
messageRCMessage消息内容

即将显示消息

重写 RCConversationViewController 的此方法,可自定义处理该事件。

- (void)willDisplayMessageCell:(RCMessageBaseCell *)cell atIndexPath:(NSIndexPath *)indexPath;
参数类型说明
cellRCMessageBaseCell消息 Cell
indexPathNSIndexPath该 Cell 对应的消息Cell数据模型在数据源中的索引值

显示未注册消息的 Cell

重写 RCConversationViewController 的此方法,可设置未知消息类型(未注册的消息类型)的 Cell。

- (RCMessageBaseCell *)rcUnkownConversationCollectionView:(UICollectionView *)collectionView
cellForItemAtIndexPath:(NSIndexPath *)indexPath;

返回的 RCMessageBaseCell 及未注册消息需要显示的 Cell。

参数类型说明
collectionViewUICollectionView当前 CollectionView
indexPathNSIndexPath该Cell对应的消息Cell数据模型在数据源中的索引值

显示未注册消息的 Cell 的高度

重写 RCConversationViewController 的此方法,可设置未知消息类型(未注册的消息类型)的 Cell 的显示高度。

- (CGSize)rcUnkownConversationCollectionView:(UICollectionView *)collectionView
layout:(UICollectionViewLayout *)collectionViewLayout
sizeForItemAtIndexPath:(NSIndexPath *)indexPath;

返回的 CGSize 为未注册消息 Cell 需要显示的高度。

参数类型说明
collectionViewUICollectionView当前CollectionView
collectionViewLayoutUICollectionViewLayout当前CollectionView Layout
indexPathNSIndexPath该Cell对应的消息Cell数据模型在数据源中的索引值

点击消息 Cell 头像

重写 RCConversationViewController 的此方法,可自定义处理该事件。

- (void)didTapCellPortrait:(NSString *)userId;
参数类型说明
userIdNSString点击头像对应的用户ID

长按消息 Cell 头像

重写 RCConversationViewController 的此方法,可自定义处理该事件。

- (void)didLongPressCellPortrait:(NSString *)userId;
参数类型说明
userIdNSString点击头像对应的用户 ID

点击消息 Cell 内容

重写 RCConversationViewController 的此方法,可自定义处理该事件。

- (void)didTapMessageCell:(RCMessageModel *)model;
参数类型说明
modelRCMessageModel消息Cell的数据模型
提示

IMKit 在此点击事件中融云定义的图片、语音、位置等消息有默认的处理,如查看、播放等。重写此回调时,如果想保留 SDK 原有的功能,需要注意调用 super。

长按消息 Cell 内容

重写 RCConversationViewController 的此方法,可自定义处理该事件。

- (void)didLongTouchMessageCell:(RCMessageModel *)model inView:(UIView *)view;
参数类型说明
modelRCMessageModel消息Cell的数据模型
viewUIView长按区域的View
提示

重写此回调时,如果想保留 SDK 原有的功能,需要注意调用 super。

点击消息 Cell 中的 URL

重写 RCConversationViewController 的此方法,可自定义处理该事件。

- (void)didTapUrlInMessageCell:(NSString *)url model:(RCMessageModel *)model;
参数类型说明
modelRCMessageModel消息Cell的数据模型
urlNSString点击的URL

注意

重写此回调时,如果想保留 SDK 原有的功能,需要注意调用 super。

点击消息 Cell 中的电话号码

重写 RCConversationViewController 的此方法,可自定义处理该事件。

- (void)didTapPhoneNumberInMessageCell:(NSString *)phoneNumber model:(RCMessageModel *)model;
参数类型说明
modelRCMessageModel消息Cell的数据模型
phoneNumberNSString点击的电话号码

获取长按消息 Cell 的菜单

重写 RCConversationViewController 的此方法,可自定义处理该事件。

- (NSArray<UIMenuItem *> *)getLongTouchMessageCellMenuList:(RCMessageModel *)model;
参数类型说明
modelRCMessageModel消息 Cell 的数据模型

注意

重写此回调时,如果想保留 SDK 原有的功能,需要注意调用 super。

开始录制录音

重写 RCConversationViewController 的此方法,可自定义处理该事件。

- (void)onBeginRecordEvent;

结束录制录音

重写 RCConversationViewController 的此方法,可自定义处理该事件。

- (void)onEndRecordEvent;

取消录制录音

重写 RCConversationViewController 的此方法,可自定义处理该事件。

- (void)onCancelRecordEvent;

点击常用语按钮事件

提示

要求 IMKit 版本 ≧ 5.6.3。

如果启用了 IMKit 快捷回复 功能,用户在会话页面点击常用语按钮后会弹出快捷回复。

您可以重写 RCConversationViewController 的以下方法,返回 YES 表示拦截,您可以自定义点击常用语按钮后的逻辑;否则返回 NO,继续执行 SDK 默认逻辑。

- (BOOL)didTapCommonPhrasesButton;

消息全部拉取完成事件

注意

此功能要求 IMKit SDK 版本 ≧ 5.8.2。

在实现消息拉取功能时,您可能需要知道何时已经拉取完所有可用的远端消息。为了获取这样的通知事件,您可以重写 RCConversationViewController 类中的 noMoreMessageToFetch 方法。

- (void)noMoreMessageToFetch;