Files
TIMSDK/iOS/TUIKit/TUIChat/UI/Chat/TUIBaseChatViewController.h
T
2021-11-22 14:37:45 +08:00

281 lines
12 KiB
Objective-C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/******************************************************************************
*
* 腾讯云通讯服务界面组件 TUIKIT - 聊天界面组件
*
* 本文件主要声明用于实现聊天界面的组件,支持 1v1 单聊和群聊天两种模式,其中包括:
* - 消息展示区:也就是气泡展示区。
* - 消息输入区:也就是让用户输入消息文字、发表情以及图片和视频的部分。
*
* TUIBaseChatViewController 类用于实现聊天视图的总控制器,负责将输入、消息控制器、更多视图等进行统一控制。
* 本文件中声明的类与协议,能够有效的帮助您实现自定义消息格式。
*
* TUIChatControllerListener 负责提供聊天控制器的部分回调委托。包括接收新消息、显示新消息和某一“更多”单元被点击的回调。
*
******************************************************************************/
#import <UIKit/UIKit.h>
#import "TUIInputController.h"
#import "TUIMessageController.h"
#import "TUICommonModel.h"
#import "TUIChatConversationModel.h"
@class TUIBaseChatViewController;
/**
* moreCell 优先级,优先级越好,排列越靠前
*/
typedef NS_ENUM(NSInteger, MoreCellPriority) {
MoreCellPriority_High = 0, ///< 高优先级
MoreCellPriority_Nomal = 1, ///< 中优先级
MoreCellPriority_Low = 2, ///< 低优先级
MoreCellPriority_Lowest = 3, ///< 最低优先级
};
/////////////////////////////////////////////////////////////////////////////////
//
// TUIChatControllerListener
//
/////////////////////////////////////////////////////////////////////////////////
/**
* TUIChatControllerListener 协议
* 此协议旨在帮助开发者根据自身需求实现自定义消息。
* 自定义消息的的具体实现方法,请参照链接 https://github.com/tencentyun/TIMSDK/wiki/TUIKit-iOS%E8%87%AA%E5%AE%9A%E4%B9%89%E6%B6%88%E6%81%AF
*/
@protocol TUIChatControllerListener <NSObject>
@optional
/**
* 发送新消息时的回调
*
* @param controller 委托者,当前聊天控制器。
* @param msg 消息。
*/
- (void)chatController:(TUIBaseChatViewController *)controller didSendMessage:(V2TIMMessage *)msg;
/**
* 接收新消息时的回调,用于甄别自定义消息
*
* 每条新消息在进入气泡展示区之前,都会通过 onNewMessage() 通知给您的代码。
* - 如果您返回 nil,TUIBaseChatViewController 会认为该条消息非自定义消息,会将其按照普通消息的处理流程进行处理。
* - 如果您返回一个 TUIMessageCellData 类型的对象,TUIBaseChatViewController 会在随后触发的 onShowMessageData() 回调里传入您返回的 cellData 对象。
*
* 也就是说,onNewMessage() 负责让您甄别自己的个性化消息,而 onShowMessageData() 回调则负责让您展示这条个性化消息。
*
* <pre>
* - (TUIMessageCellData *)chatController:(TUIBaseChatViewController *)controller onNewMessage:(TIMMessage *)msg
* {
* TIMElem *elem = [msg getElem:0];
* //判断是否为自定义元素。
* if([elem isKindOfClass:[TIMCustomElem class]]){
* MyCustomCellData *cellData = [[MyCustomCellData alloc] initWithDirection:msg.isSelf ? MsgDirectionOutgoing : MsgDirectionIncoming];
*
* //MyCustomCellData 是您自定义的消息类型,假设它包含 text 和 link 两个字段
* //此处省略从 elem 解析出自定义数据的代码段
*
* cellData.text = @"这是我的自定义消息";
* cellData.link = @"www.qq.com";
* return cellData;
* }
* return nil;
* }
* </pre>
*
* @param controller 委托者,当前聊天控制器。
* @param msg 接收到的新消息,在此回调中,特指包含您自定义消息类型的消息元素。
* @return 返回一个消息单元数据源,此数据源为您自定义的消息数据源,继承自 TUIMessageCellData。当接收到的消息不是您的自定义消息时,您可以返回 nil。
*/
- (TUIMessageCellData *)chatController:(TUIBaseChatViewController *)controller onNewMessage:(V2TIMMessage *)msg;
/**
* 展示自定义个性化消息
*
* 您可以通过重载 onShowMessageData() 改变消息气泡的默认展示逻辑,只需要返回一个自定义的 TUIMessageCell 对象即可。
*
* <pre>
* - (TUIMessageCell *)chatController:(TUIBaseChatViewController *)controller onShowMessageData:(TUIMessageCellData *)data
* {
* //判定当前传入数据源是否为自定义消息的数据源
* if ([data isKindOfClass:[MyCustomCellData class]]) {
* MyCustomCell *myCell = [[MyCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MyCell"];
* [myCell fillWithData:(MyCustomCellData *)data];
* return myCell;
* }
* return nil;
* }
* </pre>
*
* 在上述代码中,当我们判定待显示的数据源为自定义数据源时,我们便实例化 MyCustomCell,并通过传入的 data 进行初始化,并将 MyCustomCell 作为返回值返回。
* 当我们判断传入的数据并非自定义数据源时,我们可以返回 nil。
* 需要注意的是,在此处的 MyCustomCell 在此处略过了具体的声明与实现。如果您对自定义消息单元的声明与实现有疑问的话,请参考本协议声明时,注释中给出的链接。
*
* @param controller 委托者,当前聊天控制器。
* @param cellData 即将显示的消息单元的数据源,在此回调中,特指您自定义的消息数据源。
*
* @return 返回一个即将显示的消息单元,此消息单元为您自定义的消息单元,继承自 TUIMessageCell。当接收到的消息不是您的自定义消息时,您可以返回空。
*/
- (TUIMessageCell *)chatController:(TUIBaseChatViewController *)controller onShowMessageData:(TUIMessageCellData *)cellData;
/**
*
* cell将要显示事件
* @param controller 委托者,当前聊天控制器。
* @param cell 即将显示的消息Cell
* @param cellData 即将显示的消息单元的数据源。
*/
- (void)chatController:(TUIBaseChatViewController *)controller willDisplayCell:(TUIMessageCell *)cell withData:(TUIMessageCellData *)cellData;
/**
* “更多” 单元注册回调。
*
* @param chatController 委托者,当前聊天控制器。
* @return 返回需要注册的 “更多” 单元。
*/
- (NSArray <TUIInputMoreCellData *> *)chatController:(TUIBaseChatViewController *)chatController onRegisterMoreCell:(MoreCellPriority *)priority;
/**
* “更多”单元点击回调。
* 当您点击某一“更多”单元后回执行该回调,您可以通过该回调实现对“更多”视图的定制。
* 比如您在更多视图4个单元的基础上,添加了一个名为 myMoreCell 的第5个单元,则您可以按下列代码实现该自定义单元的响应回调。
* <pre>
* - (void)chatController:(TUIBaseChatViewController *)chatController onSelectMoreCell:(TUIInputMoreCell *)cell{
* if ([cell.data.title isEqualToString:@"myMoreCell"]) {
* //Do something
* }
* }
*</pre>
*
* @param chatController 委托者,当前聊天控制器。
* @param cell 被点击的“更多”单元,在此回调中特指您自定义的“更多”单元。
*/
- (void)chatController:(TUIBaseChatViewController *)chatController onSelectMoreCell:(TUIInputMoreCell *)cell;
/**
* 点击消息头像回调
* 默认点击头像是打开联系人资料页,如果您实现了此方法,则内部不做任何处理
*
* @param controller 会话对象
* @param cell 所点击的消息单元
*/
- (void)chatController:(TUIBaseChatViewController *)controller onSelectMessageAvatar:(TUIMessageCell *)cell;
/**
* 点击消息内容回调
*
* @param controller 会话对象
* @param cell 所点击的消息单元
*/
- (void)chatController:(TUIBaseChatViewController *)controller onSelectMessageContent:(TUIMessageCell *)cell;
/**
* 获取消息摘要回调(主要用于消息合并转发)
*
* @param controller 会话对象
* @param message 消息对象
* @return 返回消息摘要信息
*/
- (NSString *)chatController:(TUIBaseChatViewController *)controller onGetMessageAbstact:(V2TIMMessage *)message;
@end
/////////////////////////////////////////////////////////////////////////////////
//
// TUIBaseChatViewController
//
/////////////////////////////////////////////////////////////////////////////////
/**
* 【模块名称】聊天界面组件(TUIBaseChatViewController)
*
* 【功能说明】负责实现聊天界面的 UI 组件,包括消息展示区和消息输入区。
*
* TUIBaseChatViewController 类用于实现聊天视图的总控制器,负责将聊天消息控制器(TUIMessageController)、信息输入控制器(TUIInputController)和更多视频进行统一控制。
*
* 聊天消息控制器负责在您接收到新消息或者发送消息时在 UI 作出响应,并响应您在消息气泡上的交互操作,详情参考:Section\Chat\TUIMessageController.h
* 信息输入控制器负责接收您的输入,向你提供输入内容的编辑功能并进行消息的发送,详情参考:Section\Chat\Input\TUIInputController.h
* 本类中包含了“更多”视图,即在您点击 UI 中“+”按钮时,能够显示出更多按钮来满足您的进一步操作,详情参考:Section\Chat\TUIMoreView.h
*
* Q: 如何实现自定义的个性化消息气泡功能?
* A: 如果您想要实现 TUIKit 不支持的消息气泡样式,比如在消息气泡中添加投票链接等,可以参考文档:
* https://github.com/tencentyun/TIMSDK/wiki/TUIKit-iOS%E8%87%AA%E5%AE%9A%E4%B9%89%E6%B6%88%E6%81%AF
*/
@interface TUIBaseChatViewController : UIViewController
/// 会话数据
@property (nonatomic) TUIChatConversationModel *conversationData;
#pragma mark - 用于消息搜索场景
/**
高亮文本,在搜索场景下,当highlightKeyword不为空时,且与locateMessage匹配时,打开聊天会话页面会高亮显示当前的cell
*/
@property (nonatomic, copy) NSString *highlightKeyword;
/**
* 定位消息,在搜索场景下,当locateMessage不为空时,打开聊天会话页面会自动定位到此处
*/
@property (nonatomic, strong) V2TIMMessage *locateMessage;
/**
* 未读数展示 view
*/
@property TUIUnReadView *unRead;
/**
* TUIKit 聊天消息控制器
* 负责消息气泡的展示,同时负责响应用户对于消息气泡的交互,比如:点击消息发送者头像、轻点消息、长按消息等操作。
* 聊天消息控制器的详细信息请参考 Section\Chat\TUIMessageController.h
*/
@property TUIMessageController *messageController;
/**
* TUIKit 信息输入控制器。
* 负责接收用户输入,同时显示“+”按钮与语音输入按钮、表情按钮等。
* 同时 TUIInputController 整合了消息的发送功能,您可以直接使用 TUIInputController 进行消息的输入采集与发送。
* 信息输入控制器的详细信息请参考 Section\Chat\Input\TUIInputController.h
*/
@property TUIInputController *inputController;
/**
* 被委托类,负责实现并执行 TUIChatControllerListener 的委托函数
*/
@property (weak) id<TUIChatControllerListener> delegate;
/**
* 更多菜单视图数据的数据组
* 更多菜单视图包括:拍摄、图片、视频、文件。详细信息请参考 Section\Chat\TUIMoreView.h
*/
@property NSArray<TUIInputMoreCellData *> *moreMenus;
/**
* 是否展示视频通话按钮,如果集成了 TUICalling 组件,默认会展示
*/
@property (nonatomic) BOOL isEnableVideoCall;
/**
* 是否展示音频通话按钮,如果集成了 TUICalling 组件,默认会展示
*/
@property (nonatomic) BOOL isEnableAudioCall;
/**
* 是否展示群直播通话按钮,如果集成了 TUIKitLive 组件,默认会展示
*/
@property (nonatomic) BOOL isEnableLive;
/**
* 是否展示自定义消息按钮,默认会展示
*/
@property (nonatomic) BOOL isEnableLink;
/**
* 发送消息
*/
- (void)sendMessage:(V2TIMMessage *)message;
/**
* 保存草稿。
* 以草稿的格式,保存当前聊天视图中未删除且未发送的信息。
* 本函数会在您返回父视图时自动调用。
* 需要注意的是,目前版本仅能保存未发送的文本消息作为草稿。
*/
- (void)saveDraft;
@end