环信的消息列表的实现

2017-03-21  本文已影响0人  allenzhan

前面几天都在忙其它事情,刚集成的环信就只有登录、注册、还有简单的聊天界面,又把他放在了一边,今天重新集成。准备做一下消息列表。

下面说一下,基本的消息列表的数据展示和交互。
如图所示,一般的消息列表有头像、未读的消息数量、对方的昵称、还有最后一条消息的内容、以及最后一条消息的时间。然后聊天记录会按照时间的远近来排序。

环信的消息列表的实现

下面就看看怎么实现吧。

1.首先我们搭个大概的框架,我们准备用TableView来展示我们的消息列表下面这个方法可以获取到当前的所有会话,返回一个数组

[[EMClient sharedClient].chatManager getAllConversations]

获得上面的所有会话后,我们将值赋值给自己的数据源

 self.data = (NSMutableArray *) [[EMClient sharedClient].chatManager getAllConversations];

//别忘记了刷新我们的TableView;

环信也给我们自定义好了这个列表的Cell,叫EaseConversationCell
下面就是列表的代理方法的实现

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    return _data.count;
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 60;
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
   
    
    EaseConversationCell * cell = [tableView dequeueReusableCellWithIdentifier:@"reuseID"];
    
    if (!cell) {
        cell = [[EaseConversationCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"reuseID"];
    }
    

    
    EMConversation *conversation = [_data objectAtIndex:indexPath.row];
//    
//    EMConversationTypeChat  = 0,    /*! \~chinese 单聊会话 \~english one to one chat room type */
//    EMConversationTypeGroupChat,    /*! \~chinese 群聊会话 \~english Group chat room type */
//    EMConversationTypeChatRoom      /*! \~chinese 聊天室会话 \~english Chatroom chat room type */
    
    switch (conversation.type) {
            //单聊会话
        case EMConversationTypeChat:
        {

//这里有个小坑,刚开始不知道怎么获取到对方的昵称,就用了下面的方法去获取,根据当前的会话是接收方还是发送方来获取发送的对象,或接收的对象,结果有些能获取到,有些返回的Null,
//            cell.textLabel.text = [conversation lastReceivedMessage].direction == EMMessageDirectionSend? [conversation lastReceivedMessage].to : [conversation lastReceivedMessage].from;
            cell.titleLabel.text = conversation.conversationId;// [conversation lastReceivedMessage].direction == EMMessageDirectionSend? [conversation lastReceivedMessage].to : [conversation lastReceivedMessage].from;
            NSLog(@"发送方%@------接收方%@",[conversation lastReceivedMessage].from,[conversation lastReceivedMessage].to);
            //头像,我这里用固定的头像
            cell.avatarView.image = [UIImage imageNamed:@"home"];
            //是否显示角标
            cell.avatarView.showBadge = YES;
            //未读消息数量
            cell.avatarView.badge = conversation.unreadMessagesCount;
            break;
            
            
        }
        default:
            break;
    }

    
    
    //这里是将会话的最后一条消息装换成具体内容展示
    cell.detailLabel.text = [self subTitleMessageByConversation:conversation];

//这里是将时间戳格式转换成日期格式
    NSString * str = [YMHXTool timeByMessageTime:[NSString stringWithFormat:@"%lld",[conversation latestMessage].localTime]];
    cell.timeLabel.text = str;//[NSString stringWithFormat:@"%lld",[conversation latestMessage].localTime];
    
    
    return cell;
}

下面的这个方法是获取该会话的最后一条消息,当然图片,语音之类的消息文本,就用字符串代替了

//得到最后消息文字或者类型
-(NSString *)subTitleMessageByConversation:(EMConversation *)conversation
{
    NSString *ret = @"";
    EMMessage *lastMessage = [conversation latestMessage];
    EMMessageBody * messageBody = lastMessage.body;
    if (lastMessage) {
        EMMessageBodyType  messageBodytype = lastMessage.body.type;
        switch (messageBodytype) {
                
                
                //                 EMMessageBodyTypeText   = 1,    /*! \~chinese 文本类型 \~english Text */
                //                EMMessageBodyTypeImage,         /*! \~chinese 图片类型 \~english Image */
                //                EMMessageBodyTypeVideo,         /*! \~chinese 视频类型 \~english Video */
                //                EMMessageBodyTypeLocation,      /*! \~chinese 位置类型 \~english Location */
                //                EMMessageBodyTypeVoice,         /*! \~chinese 语音类型 \~english Voice */
                //                EMMessageBodyTypeFile,          /*! \~chinese 文件类型 \~english File */
                //                EMMessageBodyTypeCmd,           /*! \~chinese 命令类型 \~english Command */
                
                
                
                
                //图像类型
            case EMMessageBodyTypeImage:
            {
                ret = NSLocalizedString(@"图片消息", @"[image]");
            } break;
                //文本类型
            case EMMessageBodyTypeText:
            {
                NSString *didReceiveText = [EaseConvertToCommonEmoticonsHelper
                                            convertToSystemEmoticons:((EMTextMessageBody *)messageBody).text];  //表情映射
                ret = didReceiveText;
            } break;
                //语音类型
            case EMMessageBodyTypeVoice:
            {
                ret = NSLocalizedString(@"语音消息", @"[voice]");
            } break;
                //位置类型
            case EMMessageBodyTypeLocation:
            {
                ret = NSLocalizedString(@"地理位置信息", @"[location]");
            } break;
                //视频类型
            case EMMessageBodyTypeVideo:
            {
                ret = NSLocalizedString(@"视频消息", @"[video]");
            } break;
                
            default:
                break;
        }
    }
    
    return ret;
}

到了上面这一步其实基本已经完成了,下面要做的就是讲所有会话,按照时间来排序。

 self.data = (NSMutableArray *) [YMHXTool sortByLocalTime:self.data];//别忘了刷新数据源
//会话列表排序
+(NSArray *)sortByLocalTime:(NSArray *)conversationArr
{
  return  [conversationArr sortedArrayUsingComparator:^NSComparisonResult(EMConversation*  _Nonnull obj1, EMConversation *  _Nonnull obj2) {
    
  //这里根据客户端接收到该消息的时间来进行排序
      return [@([obj2 latestMessage].localTime) compare:@([obj1 latestMessage].localTime)];
      //降序
  }];
}

然后就可以达到上图的效果

下次讲解如何将时间戳转换成时间的格式。

上一篇下一篇

猜你喜欢

热点阅读