IOS [ 即时通讯 ]发送文本消息 代码
����```
import "bingeChatViewController.h"
import "bingeInputView.h"
/*
1.隐藏和显示tabBar
2.为inputView 加分割线
3.title 好友聊天标题
4.监听键盘弹出 对相应的布局做修改
5.获取发送消息信息
*/
// 宏 自定义View高度为44
define KInputViewH 44
@interface bingeChatViewController () <UITableViewDelegate,UITableViewDataSource, UITextFieldDelegate>
//由这两个控件组成
@property (nonatomic,strong) UITableView *tableView;
@property (nonatomic,strong) bingeInputView *inputView;
// 发送消息列表数组
@property (nonatomic,strong) NSMutableArray *chatMsgs;
@end
@implementation bingeChatViewController
// 1.
-(UITableView *)tableView {
if (!_tableView) {
_tableView = [[UITableView alloc]init];
// 代理方法
_tableView.dataSource = self;
_tableView.delegate = self;
// Xib View 的位置
_tableView.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height - KInputViewH);
}
return _tableView;
}
// 2.
-(UIView *)inputView {
if (!_inputView) {
_inputView = [bingeInputView binge_inputView];
_inputView.textField.delegate = self;
_inputView.frame = CGRectMake(0, self.view.bounds.size.height - KInputViewH, self.view.bounds.size.width, KInputViewH);
}
return _inputView;
}
- (NSMutableArray *)chatMsgs {
if (!_chatMsgs) {
_chatMsgs = [NSMutableArray array];
}
return _chatMsgs;
}
// 3.
- (void)viewDidLoad {
[super viewDidLoad];
// 添加子控件
[self.view addSubview:self.tableView];
[self.view addSubview:self.inputView];
// 添加标题
self.title = self.buddy.username;
// 点击空白处收键盘
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(fingerTapped:)];
[self.view addGestureRecognizer:singleTap];
// 获取会话中的聊天记录
[self binge_reloadChatMsgs];
//监听键盘弹出 对相应的布局组修改
[self binge_observerKeyboardFrameChange];
}
pragma mark - tabBar 隐藏和显示
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
// 隐藏 tabBar 控件
self.navigationController.tabBarController.tabBar.hidden = YES;
} - (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
// 隐藏 tabBar 控件
self.navigationController.tabBarController.tabBar.hidden = NO;
}
pragma mark - UITableViewDataSource
-
(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.chatMsgs.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"chatID"];
if (!cell) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"chatID"];
EMMessage *msg = self.chatMsgs[indexPath.row];
NSLog(@"msg = %@",msg);
EMTextMessageBody *body = msg.messageBodies.firstObject;
cell.textLabel.text = body.text;
}
return cell; // 创建消息后 记得返回到cell
}
pragma mark - 收起键盘
// 滑动空白处隐藏键盘
-
(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
[self.view endEditing:YES];
}
// 点击空白处收键盘
-(void)fingerTapped:(UITapGestureRecognizer *)gestureRecognizer {
[self.view endEditing:YES];
}
pragma mark - UITextFieldDelegate 发送消息
-
(BOOL)textFieldShouldReturn:(UITextField *)textField {
// 此处发送消息
// 3.创建EMChatText 对象
EMChatText *chatText = [[EMChatText alloc] initWithText:textField.text];// 2.创建body 对象,发现需要chatText
EMTextMessageBody *body = [[EMTextMessageBody alloc] initWithChatObject:chatText];// 1.创建消息,发现body 对象
EMMessage *emsg = [[EMMessage alloc] initWithReceiver:self.buddy.username bodies:@[body]];// 0.要发送消息,发现需要创建消息
// 异步方法,发送一条消息
// 待发送的消息对象和发送后的消息对象是同一个对象,在发送过程中对象属性可能会被更改
[[EaseMob sharedInstance].chatManager asyncSendMessage:emsg
progress:nil
prepare:^(EMMessage *message, EMError *error) {
// 即将发送时间的回调
}
onQueue:nil
completion:^(EMMessage *message, EMError *error) {
// 发送结束时的回调
if (!error) {
NSLog(@"发送成功");
// 清空文本输入款
textField.text = nil;
// 发送成功之后将键盘退回去
[textField resignFirstResponder];
// 刷新界面
[self binge_reloadChatMsgs];
}
}
onQueue:nil];
// 发送成功之后 刷新列表 【定义一个可变数组】
return YES;
}
pragma mark - 私有方法
-
(void)binge_reloadChatMsgs {
// 首先刷新的时候要移除已有的对象
[self.chatMsgs removeAllObjects];// 拿到当前的会话对象 一个传username 另一个传聊天样式
/*
@brief 会话类型
@constant eConversationTypeChat 单聊会话
@constant eConversationTypeGroupChat 群聊会话
@constant eConversationTypeChatRoom 聊天室会话
*/
EMConversation *conversation = [[EaseMob sharedInstance].chatManager conversationForChatter:self.buddy.username conversationType:eConversationTypeChat];
// 获取会话中的聊天记录 (从数据库中加载消息)
NSArray *msgs = [conversation loadAllMessages];
// 放进可变数组中 改变数据
[self.chatMsgs addObjectsFromArray:msgs];// 刷新表格
[self.tableView reloadData];
// 滚到最下面
}
-
(void)binge_observerKeyboardFrameChange {
// 监听键盘 对相应的布局做修改
[[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillChangeFrameNotification
object:nil
queue:[NSOperationQueue mainQueue]// 在哪个线程执行
usingBlock:^(NSNotification * _Nonnull note) {
NSLog(@"%s,line = %d,note = %@",FUNCTION,LINE,note);/* note.userInfo 布局参数 UIKeyboardAnimationCurveUserInfoKey = 7; UIKeyboardAnimationDurationUserInfoKey = "0.25"; UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {414, 271}}"; UIKeyboardCenterBeginUserInfoKey = "NSPoint: {207, 600.5}"; UIKeyboardCenterEndUserInfoKey = "NSPoint: {207, 871.5}"; UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 465}, {414, 271}}"; UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 736}, {414, 271}}"; UIKeyboardIsLocalUserInfoKey = 1; self.view 可以根据 end.oriY 来进行布局更改 */ // 初始高度 CGFloat endY = [note.userInfo [UIKeyboardFrameEndUserInfoKey] CGRectValue].origin.y; // 触发的键盘高度 CGFloat tempY = endY - self.view.bounds.size.height; self.view.frame = CGRectMake(0, tempY, self.view.bounds.size.width, self.view.bounds.size.height); // 添加动画 CGFloat duration = [note.userInfo [UIKeyboardAnimationDurationUserInfoKey] floatValue]; [UIView animateWithDuration:duration animations:^{ [self.view setNeedsLayout]; }]; }];
}
@end