跳到主要内容

页面事件监听

监听会话列表页面事件

您可以设置会话列表操作监听,实现自定义需求。会话列表 RCChatListViewController 的监听事件在代理 RCChatListViewDelegateRCChatListViewDataSourceRCChatListViewModelDelegate中,重写代理方法可以自定义处理

会话列表视图事件回调

RCChatListViewDelegate 包含 cell 即将加载、Cell 加载完成、搜索框点击、会话选中与取消选中、加载更多会话的回调,在下面方法中处理完自定义需求后,需要还需要 SDK 的默认处理,可以通过 super 调用内置的处理。

列表中的 Cell 将要加载

/// 列表中的 Cell 将要加载
/// - Parameters:
/// - listView: 列表页面
/// - chatModel: 会话对象
- (void)listView:(RCChatListView *)listView willLoadCell:(UITableViewCell *)cell
forChatModel:(RCChatModel *)chatModel;

列表中的 Cell 加载完成

/// 列表中的 Cell 加载完成
/// - Parameters:
/// - listView: 列表页面
/// - chatModel: 会话消息对象
- (void)listView:(RCChatListView *)listView didLoadCell:(UITableViewCell *)cell
forChatModel:(RCChatModel *)chatModel;

搜索框点击事件

/// 搜索框点击事件
/// - Parameter listView: 会话列表
/// - Parameter searBar: 搜索条
- (void)listView:(RCChatListView *)listView didClickSearchBar:(RCChatListSearchBar *)searBar;

选中会话列表中的会话

/// 选中会话列表中的会话
/// - Parameter listView: 会话列表
/// - Parameter chatModel: 会话对象
- (void)listView:(RCChatListView *)listView didSelectedChat:(RCChatModel *)chatModel;

取消选中会话列表中的会话

/// 取消选中会话列表中的会话
/// - Parameter listView: 会话列表
/// - Parameter chatModel: 会话对象
- (void)listView:(RCChatListView *)listView didDeselectedChat:(RCChatModel *)chatModel;

会话列表即将加载更多

/// 会话列表即将加载更多
/// - Parameter listView: 会话列表
/// - Parameter chatModel: 会话对象
- (void)listView:(RCChatListView *)listView didDetectPreloadingAtIndexPath:(NSIndexPath *)indexPath;

会话列表视图数据源

RCChatListViewDataSource 可以获取到会话加载的数据源、会话左滑或者右滑编辑项, 并对其做增删改查操作。

会话列表数据

/// 会话列表数据
/// - Parameters:
/// - listView: 会话列表组件
/// - tableView: tableView
- (NSArray<RCChatModel *> *)listView:(RCChatListView *)listView
chatModelsInTableView:(UITableView *)tableView;

代码示例:

- (NSArray<RCChatModel *> *)listView:(RCChatListView *)listView chatModelsInTableView:(UITableView *)tableView {
NSMutableArray *tempArray = [super listView:listView chatModelsInTableView:tableView].mutableCopy;
/// 对 tempArray 做增删改操作
///
return tempArray;
}

会话左滑或右滑编辑项

/// 根据 indexPath 及滑动方向返回 cell 显示的 items
/// - Parameter listView: 会话列表
/// - Parameter indexPath: 会话位置
/// - Parameter direction 滑动方向
- (NSArray<RCSwipeItem *> *)listView:(RCChatListView *)listView
cellSwipeItemsAtIndexPath:(NSIndexPath *)indexPath
forDirection:(RCSwipeDirection)direction;

代码示例:

- (NSArray<RCSwipeItem *> *)listView:(RCChatListView *)listView cellSwipeItemsAtIndexPath:(NSIndexPath *)indexPath forDirection:(RCSwipeDirection)direction {
NSMutableArray *tempArray = [super listView:listView cellSwipeItemsAtIndexPath:indexPath forDirection:direction].mutableCopy;
/// 对 tempArray 做增删改操作

return tempArray;
}

会话列表 ViewModel 回调

RCChatListViewModelDelegate 包含更新会话 View 相关的回调,在下面方法中处理完自定义需求后,需要还需要 SDK 的默认处理,可以通过 super 调用内置的处理。

刷新会话列表

/// 刷新会话列表
/// - Parameter viewModel: ViewModel
/// - Parameter chatModels: 会话数据
- (void)viewModel:(RCChatListViewModel *)viewModel chatListDidReload:(NSArray<RCChatModel *> *)chatModels;

插入会话

/// 插入会话
/// - Parameter viewModel: ViewModel
/// - Parameter indexSet: 会话 index list
- (void)viewModel:(RCChatListViewModel *)viewModel chatListDidInsertAtIndexSet:(NSIndexSet *)indexSet;

移动会话

/// 移动会话
/// - Parameter viewModel: ViewModel
/// - Parameter indexSet: 会话 index list
- (void)viewModel:(RCChatListViewModel *)viewModel chatListDidMoveFromIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex;

刷新某些会话

/// 刷新某些会话
/// - Parameter viewModel: ViewModel
/// - Parameter indexSet: 会话 index list
- (void)viewModel:(RCChatListViewModel *)viewModel chatListDidUpdateAtIndexSet:(NSIndexSet *)indexSet;

移除某些会话

/// 移除某些会话
/// - Parameter viewModel: ViewModel
/// - Parameter indexSet: 会话 index list
- (void)viewModel:(RCChatListViewModel *)viewModel chatListDidRemoveAtIndexSet:(NSIndexSet *)indexSet;

会话列表所有数据加载完成

/// 会话列表所有数据加载完成
/// - Parameter viewModel: ViewModel
- (void)viewModelDidLoadAllChat:(RCChatListViewModel *)viewModel;

会话列表有错误产生

/// 会话列表有错误产生
/// - Parameters:
/// - viewModel: ViewModel
/// - error: 错误信息
- (void)viewModel:(RCChatListViewModel *)viewModel errorDidOccur:(NSError *)error;

监听会话页面事件

您可以设置会话页面操作监听,实现自定义需求。以下列出了 RCChatViewController 提供的常用事件。

导航右键更多页面将要展示

/// 更多页面将要展示
/// - Parameters:
/// - items: 内置事件
/// - chatModel: 会话对象
- (NSArray<RCChatMoreBarItem *> *)willDisplayMoreMenu:(NSArray<RCChatMoreBarItem *> *)items
forChatModel:(RCChatModel *)chatModel;

导航右键更多页面搜索点击事件

- (void)didClickSearchBarItem;

长按消息编辑视图将要展示

- (NSArray<RCMessageEditBarItem *> *)willDisplayEditMenu:(NSArray<RCMessageEditBarItem *> *)items
forMessageModel:(RCMessageModel *)messageModel;

选择消息时底部编辑视图将要展示

- (NSArray<RCMessageSelectionBarItem *> *)willDisplaySelectBar:(NSArray<RCMessageSelectionBarItem *> *)items
forChatModel:(RCChatModel *)chatModel;

点击逐步转发事件

- (void)forwardOriginalMessages:(NSArray *)messageModels;

点击合并转发事件

- (void)forwardCombinedMessages:(NSArray *)messageModels;

结束选择事件

- (void)endSelection;

消息列表事件

消息列表事件在 RCMessageListViewDelegate

@protocol RCMessageListViewDelegate <NSObject>

@optional

/// 列表中的 Cell 将要加载
/// - Parameters:
/// - listView: 列表页面
/// - messageModel: 消息对象
- (void)listView:(RCMessageListView *)listView willLoadCell:(UITableViewCell *)cell forMessageModel:(RCMessageModel *)messageModel;

/// 列表中的 Cell 加载完成
/// - Parameters:
/// - listView: 列表页面
/// - messageModel: 消息对象
- (void)listView:(RCMessageListView *)listView didLoadCell:(UITableViewCell *)cell forMessageModel:(RCMessageModel *)messageModel;

/// 列表中的 Cell 将要展示
/// - Parameters:
/// - listView: 列表页面
/// - messageModel: 消息对象
- (void)listView:(RCMessageListView *)listView willDisplayCell:(UITableViewCell *)cell forMessageModel:(RCMessageModel *)messageModel;

/// 检测到需要加载前一页数据
/// - Parameters:
/// - listView: 列表页面
/// - messageModel: 列表中的第一条消息对象
- (void)listView:(RCMessageListView *)listView didDetectPreviousPageLoadingWithMessageModel:(RCMessageModel *)messageModel;

/// 检测到需要加载后一页数据
/// - Parameters:
/// - listView: 列表页面
/// - messageModel: 列表中的最后一条消息对象
- (void)listView:(RCMessageListView *)listView didDetectNextPageLoadingWithMessageModel:(RCMessageModel *)messageModel;

/// 选中列表条目
/// - Parameters:
/// - listView: 列表页面
/// - tableView: tableView
/// - indexPath: indexPath
- (void)listView:(RCMessageListView *)listView didSelectRow:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath;

/// 取消选中列表条目
/// - Parameters:
/// - listView: 列表页面
/// - tableView: tableView
/// - indexPath: indexPath
- (void)listView:(RCMessageListView *)listView didDeselectRow:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath;

/// 列表中的未读消息被点击
/// - Parameters:
/// - listView: 列表页面
/// - unreadView: 消息未读页面
/// - type: 未读类型
- (void)listView:(RCMessageListView *)listView didTapUnreadView:(RCMessageUnreadView *)unreadView type:(RCMessageUnreadViewType)type;

@end

消息列表数据源相关

消息列表数据源相关在 RCMessageListViewDataSource

@protocol RCMessageListViewDataSource <NSObject>

@required

/// 当前列表的消息
/// - Parameters:
/// - listView: 列表组件
/// - tableView: tableView
- (NSArray<RCMessageModel *> *)listView:(RCMessageListView *)listView
messagesInTableView:(UITableView *)tableView;

@optional

/// 自定义消息编辑
/// - Parameters:
/// - listView: 列表组件
/// - tableView: tableView
/// - editItems: 内置编辑
/// - indexPath: indexPath
- (NSArray<RCBarItem *> *)listView:(RCMessageListView *)listView
messagesEditItems:(NSArray<RCBarItem *> *)editItems
inTableView:(UITableView *)tableView
atIndexPath:(NSIndexPath *)indexPath;

/// 自定义 Cell
/// - Parameters:
/// - listView: 列表组件
/// - indexPath: cell 的位置
/// - tableView: tableView
- (nullable UITableViewCell *)listView:(RCMessageListView *)listView
cellAtIndexPath:(NSIndexPath *)indexPath
inTableView:(UITableView *)tableView;

@end

消息 Cell 相关事件

消息 Cell 相关事件在 RCMessageCellDelegate

@protocol RCMessageCellDelegate <NSObject>

@optional

/// 点击头像
- (void)tableViewCell:(UITableViewCell *)cell
didTapPortraitView:(RCMessageModel *)messageModel;

/// 长按头像
- (void)tableViewCell:(UITableViewCell *)cell
didLongPressPortraitView:(RCMessageModel *)messageModel;

/*!
点击Cell中电话号码的回调

- Parameter phoneNumber: 点击的电话号码
- Parameter model: 消息Cell的数据模型

点击Cell中的电话号码,会调用此回调,不会再触发didTapMessageCell:。
*/
- (void)tableViewCell:(UITableViewCell *)cell
didTapPhoneNumber:(NSString *)phoneNumber
messageModel:(RCMessageModel *)messageModel;

/*!
点击Cell中URL的回调

- Parameter url: 点击的URL
- Parameter model: 消息Cell的数据模型

点击Cell中的URL,会调用此回调,不会再触发didTapMessageCell:。
*/
- (void)tableViewCell:(UITableViewCell *)cell
didTapUrl:(NSString *)url
messageModel:(RCMessageModel *)messageModel;

/*!
点击撤回消息Cell中重新编辑的回调

- Parameter model: 消息Cell的数据模型

点击撤回消息Cell中重新编辑,会调用此回调,不会再触发didTapMessageCell:。
*/
- (void)tableViewCell:(UITableViewCell *)cell
didTapReedit:(RCMessageModel *)messageModel;

/*!
点击发送失败的消息重发的回调

- Parameter model: 消息Cell的数据模型
*/
- (void)tableViewCell:(UITableViewCell *)cell
didTapResend:(RCMessageModel *)messageModel;

/*!
点击媒体消息取消发送按钮

- Parameter model: 媒体消息Cell的数据模型

仅支持取消文件消息的发送,取消后消息直接删除
*/
- (void)tableViewCell:(UITableViewCell *)cell
didTapCancelUpload:(RCMessageModel *)messageModel;

/*!
点击引用消息中被引用消息内容预览的回调

- Parameter model: 引用消息Cell的数据模型
*/
- (void)tableViewCell:(UITableViewCell *)cell
didTapReferenced:(RCMessageModel *)messageModel;

/// 点击消息内容
/// - Parameter model: 引用消息Cell的数据模型
- (void)tableViewCell:(UITableViewCell *)cell
didTapMessage:(RCMessageModel *)messageModel;

/// 长按消息内容
/// - Parameter model: 引用消息Cell的数据模型
- (void)tableViewCell:(UITableViewCell *)cell
didLongPressMessage:(RCMessageModel *)messageModel;

@end

文本输入相关事件

文本输入相关事件在 RCTextInputDelegate

@protocol RCTextInputDelegate <NSObject>

@optional

/// 输入框开始编辑
/// - Parameters:
/// - textView: 输入框
- (void)inputTextViewDidBeginEditing:(UITextView *)textView;

/// 输入框结束编辑
/// - Parameters:
/// - textView: 输入框
- (void)inputTextViewDidEndEditing:(UITextView *)textView;

/// 输入框文本变化
/// - Parameters:
/// - textView: 输入框
- (void)inputTextViewDidChange:(UITextView *)textView;

/// 将要发送文本
/// - Parameters:
/// - textView: 输入框
/// - text: 文本内容
/// - mentionedInfo : @ 信息
- (BOOL)inputTextView:(UITextView *)textView
didSelectSend:(NSString *)text
mentionedInfo:(RCMentionedInfo *)mentionedInfo;

/// 输入框文本文本将要变化
/// - Parameters:
/// - textView: 输入框
/// - range: 变化范围
/// - text: 替换文本
- (BOOL) inputTextView:(UITextView *)textView
shouldChangeTextInRange:(NSRange)range
replacementText:(NSString *)text;

/// 输入框光标变化
/// - Parameters:
/// - textView: 输入框
- (void)inputTextViewDidChangeSelection:(UITextView *)textView;

/// 输入框高度变化
/// - Parameters:
/// - textView: 输入框
/// - beginHeight: 开始高度
/// - endHeight: 结束高度
- (void)inputTextView:(UITextView *)textView
heightDidChange:(CGFloat)beginHeight
endHeight:(CGFloat)endHeight;

/// 输入框输入 @ 信息
/// - Parameters:
/// - textView: 输入框
- (void)inputTextViewDidInputMention:(UITextView *)textView;

/// 输入框取消输入 @ 信息
/// - Parameters:
/// - textView: 输入框
- (void)inputTextViewDidCancelMention:(UITextView *)textView;

@end

相册选择的回调


- (void)photoPickerDidSelect:(NSArray<PHAsset *> *)assets;