在ios中创建一个简单的聊天视图

在ios中创建一个简单的聊天视图,ios,objective-c,iphone,uitableview,chat,Ios,Objective C,Iphone,Uitableview,Chat,我需要创建一个简单的聊天视图,在这个视图中,我可以像任何消息应用程序一样显示来自两端(发送方和接收方)的消息 到目前为止,我所做的是创建了一个UITableView、一个UIButton和一个UITextField。点击UIButton,我将UITextField文本添加到数组中,现在我需要第二个端点,就像我们的消息传递应用程序(发送方端)一样 左侧是接收器,右侧是发送器 到目前为止,我的应用程序看起来像 这是我的代码: - (UITableViewCell *)tableView:(UIT

我需要创建一个简单的聊天视图,在这个视图中,我可以像任何消息应用程序一样显示来自两端(发送方和接收方)的消息

到目前为止,我所做的是创建了一个
UITableView
、一个
UIButton
和一个
UITextField
。点击UIButton,我将UITextField文本添加到数组中,现在我需要第二个端点,就像我们的消息传递应用程序(发送方端)一样

左侧是接收器,右侧是发送器

到目前为止,我的应用程序看起来像

这是我的代码:

 - (UITableViewCell *)tableView:(UITableView *)tableView
     cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

messageLabel = nil;

UITableViewCell *cell = [tableView
                         dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {

    cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    messageLabel = [[UILabel alloc] init];
    messageLabel.tag = 101;
    [cell.contentView addSubview: messageLabel];

      } else {


    messageLabel = (UILabel*)[cell.contentView viewWithTag: 101];

      }    //---calculate the height for the label---
int labelHeight = [self labelHeight:[listOfMessages objectAtIndex:indexPath.row]];
labelHeight -= bubbleFragment_height;
if (labelHeight<0) labelHeight = 0;

messageLabel.frame =
CGRectMake(bubble_x + 10, bubble_y + 5,
           (bubbleFragment_width * 3) - 25,
           (bubbleFragment_height * 2) + labelHeight - 10);

messageLabel.font = [UIFont systemFontOfSize:15];
messageLabel.textAlignment = NSTextAlignmentCenter;
messageLabel.textColor = [UIColor darkTextColor];
messageLabel.backgroundColor = [UIColor greenColor];
messageLabel.numberOfLines = 0;
messageLabel.layer.cornerRadius = 8;
messageLabel.layer.masksToBounds = YES;

messageLabel.text = [listOfMessages objectAtIndex:indexPath.row];
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

return cell;
}

-(void) sendAction:(id) sender {
[listOfMessages addObject:field.text];

[chatTable reloadData];
field.text = @"";

[field resignFirstResponder];
 }
-(UITableViewCell*)表视图:(UITableView*)表视图
cellForRowAtIndexPath:(NSIndexPath*)indexPath{
静态NSString*CellIdentifier=@“Cell”;
messageLabel=nil;
UITableViewCell*单元格=[tableView
dequeueReusableCellWithIdentifier:CellIdentifier];
如果(单元格==nil){
cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault重用标识符:CellIdentifier];
messageLabel=[[UILabel alloc]init];
messageLabel.tag=101;
[cell.contentView addSubview:messageLabel];
}否则{
messageLabel=(UILabel*)[cell.contentView视图带标记:101];
}//---计算标签的高度---
int-labelHeight=[self-labelHeight:[listOfMessages-objectAtIndex:indexath.row]];
标签高度-=气泡碎片高度;

如果(labelHeight您需要创建具有不同CellIdentifier的多个单元格,例如,发送方和接收方的单元格。您可以将其细分为文本、音频、视频和图像等类别

让我们举一个文本聊天的例子

首先,您需要在故事板或XIB中创建两个单元原型,使用不同的单元标识符,例如“
cellSender
”和“
cellseiver

UILabel
UITextView
置于单元格内,对于
cellssender
进行左对齐,对于
cellseiver
进行右对齐,以便为发送方和接收方制作不同的布局

然后你就可以用你的代码做以下事情了

  - (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    BOOL sender = NO;

// Check for the sender or receiver 
    <code for checking message is from sender or receiver>

    static NSString *CellIdentifier = sender?@"cellSender":@"cellReceiver";

    messageLabel = nil;

    UITableViewCell *cell = [tableView
                             dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {

        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

        messageLabel = [[UILabel alloc] init];
        messageLabel.tag = 101;
        [cell.contentView addSubview: messageLabel];

          } else {


        messageLabel = (UILabel*)[cell.contentView viewWithTag: 101];

          }    //---calculate the height for the label---
    int labelHeight = [self labelHeight:[listOfMessages objectAtIndex:indexPath.row]];
    labelHeight -= bubbleFragment_height;
    if (labelHeight<0) labelHeight = 0;

    messageLabel.frame =
    CGRectMake(bubble_x + 10, bubble_y + 5,
               (bubbleFragment_width * 3) - 25,
               (bubbleFragment_height * 2) + labelHeight - 10);

    messageLabel.font = [UIFont systemFontOfSize:15];
    messageLabel.textAlignment = NSTextAlignmentLeft;
    messageLabel.textColor = [UIColor darkTextColor];
    messageLabel.backgroundColor = sender? [UIColor greenColor]: [UIColor lightGrayColor];
    messageLabel.numberOfLines = 0;
    messageLabel.layer.cornerRadius = 8;
    messageLabel.layer.masksToBounds = YES;

    messageLabel.text = [listOfMessages objectAtIndex:indexPath.row];
    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

    return cell;
    }
-(UITableViewCell*)表视图:(UITableView*)表视图
cellForRowAtIndexPath:(NSIndexPath*)indexPath{
BOOL发送器=否;
//检查发送者或接收者
<检查消息的代码来自发送方或接收方>
静态NSString*CellIdentifier=sender?@“cellSender”:@“cellReceiver”;
messageLabel=nil;
UITableViewCell*单元格=[tableView
dequeueReusableCellWithIdentifier:CellIdentifier];
如果(单元格==nil){
cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault重用标识符:CellIdentifier];
messageLabel=[[UILabel alloc]init];
messageLabel.tag=101;
[cell.contentView addSubview:messageLabel];
}否则{
messageLabel=(UILabel*)[cell.contentView视图带标记:101];
}//---计算标签的高度---
int-labelHeight=[self-labelHeight:[listOfMessages-objectAtIndex:indexath.row]];
标签高度-=气泡碎片高度;

如果(labelHeight您可以使用两个不同的自定义单元格,一个用于发送方,另一个用于接收方,如下所示:

  • 寄件人
  • 接受者
  • 现在,在您的应用程序中,必须有登录和注册过程,因为它是一个聊天应用程序,并且将有与您的应用程序关联的服务器来保存数据

    您可以做的是,当您发送消息时,同时发送接收者的姓名,并将其存储在数据库中

    现在,在聊天视图中,获取所有消息数据以及接收者姓名

    获取登录过程中当前登录的
    用户名

    您可以在
    cellForRowAtIndexPath:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    
        NSString *myArrayElement = [arr_receiverUserName objectAtIndex:indexPath.row];
    
        //do something useful with myArrayElement
    
        if(![myArrayElement isEqualToString:userName])
        {
             /// These are my messages.
             //// Pop up 'mycell' here 
    
                UILabel *lbl_myText = [[UILabel alloc]initWithFrame:CGRectZero];
                [lbl_myText setLineBreakMode:NSLineBreakByWordWrapping];
                lbl_myText.minimumScaleFactor = FONT_SIZE;
                [lbl_myText setNumberOfLines:0];
                lbl_myText.textAlignment = NSTextAlignmentRight;
                [lbl_myText setFont:[UIFont systemFontOfSize:FONT_SIZE]];
    
                NSString *text = [arr_text objectAtIndex:indexPath.row];
    
                CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE]];
    
                // Checks if text is multi-line
                if (size.width > lbl_myText.bounds.size.width)
                {
                    CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);
    
                    CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:NSLineBreakByWordWrapping];
    
                    [lbl_myText setText:text];
                    [lbl_myText setFrame:CGRectMake(CELL_CONTENT_MARGIN, CELL_CONTENT_MARGIN, CELL_CONTENT_WIDTH - cell.imgv_myImage.frame.size.width -(CELL_CONTENT_MARGIN * 2), MAX(size.height, 44.0f))];
                }
    
                else
                {
                    lbl_myText.frame = CGRectMake(10, 0, cell.frame.size.width - cell.imgv_myImage.frame.size.width - 18,18);
                    lbl_myText.textAlignment = NSTextAlignmentRight;
                    [lbl_myText setText:text];
                }
    
                //lbl_myText.backgroundColor = [UIColor greenColor];
    
                [cell.contentView addSubview:lbl_myText];
    
        }
    
        else
        {
            //// These are the messages sent by some one else
    
           /// Pop up `someonecell` here
    
            UILabel *lbl_myText = [[UILabel alloc]initWithFrame:CGRectZero];
            [lbl_myText setLineBreakMode:NSLineBreakByWordWrapping];
            lbl_myText.minimumScaleFactor = FONT_SIZE;
            [lbl_myText setNumberOfLines:0];
            lbl_myText.textAlignment = NSTextAlignmentLeft;
            [lbl_myText setFont:[UIFont systemFontOfSize:FONT_SIZE]];
    
            NSString *text = [arr_text objectAtIndex:indexPath.row];
    
            CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE]];
    
            // Checks if text is multi-line
            if (size.width > lbl_myText.bounds.size.width)
            {
                CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);
    
                CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:NSLineBreakByWordWrapping];
    
                [lbl_myText setText:text];
                [lbl_myText setFrame:CGRectMake(cell.imgv_someoneImage.frame.size.width+8, CELL_CONTENT_MARGIN, CELL_CONTENT_WIDTH - cell.imgv_someoneImage.frame.size.width -(CELL_CONTENT_MARGIN * 2), MAX(size.height, 44.0f))];
            }
    
            else
            {
                lbl_myText.frame = CGRectMake(10, 0, cell.frame.size.width - cell.imgv_someoneImage.frame.size.width - 18,18);
                lbl_myText.textAlignment = NSTextAlignmentLeft;
                [lbl_myText setText:text];
            }
    
            //lbl_myText.backgroundColor = [UIColor greenColor];
    
            [cell.contentView addSubview:lbl_myText];
    
        }
    
    你可以为图像和音频做类似的事情


    对于单元格的动态高度:

     - (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    static NSString *CellIdentifier = @"Cell";
    
    messageLabel = nil;
    
    UITableViewCell *cell = [tableView
                             dequeueReusableCellWithIdentifier:CellIdentifier];
    
    if (cell == nil) {
    
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    
        messageLabel = [[UILabel alloc] init];
        messageLabel.tag = 101;
        [cell.contentView addSubview: messageLabel];
    
          } else {
    
    
        messageLabel = (UILabel*)[cell.contentView viewWithTag: 101];
    
          }    //---calculate the height for the label---
    int labelHeight = [self labelHeight:[listOfMessages objectAtIndex:indexPath.row]];
    labelHeight -= bubbleFragment_height;
    if (labelHeight<0) labelHeight = 0;
    
    messageLabel.frame =
    CGRectMake(bubble_x + 10, bubble_y + 5,
               (bubbleFragment_width * 3) - 25,
               (bubbleFragment_height * 2) + labelHeight - 10);
    
    messageLabel.font = [UIFont systemFontOfSize:15];
    messageLabel.textAlignment = NSTextAlignmentCenter;
    messageLabel.textColor = [UIColor darkTextColor];
    messageLabel.backgroundColor = [UIColor greenColor];
    messageLabel.numberOfLines = 0;
    messageLabel.layer.cornerRadius = 8;
    messageLabel.layer.masksToBounds = YES;
    
    messageLabel.text = [listOfMessages objectAtIndex:indexPath.row];
    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
    
    return cell;
    }
    
    -(void) sendAction:(id) sender {
    [listOfMessages addObject:field.text];
    
    [chatTable reloadData];
    field.text = @"";
    
    [field resignFirstResponder];
     }
    

    要根据您的
    UILabels
    调整单元格高度,请参阅如何创建2个单元格原型。由于我没有使用故事板或XibsHi mural,我可以在两个不同的nib文件上使用两个自定义单元格来实现这一点。如何设置标签框,使其与文本大小相等。@mrunal thanki…请提供上述解释的示例代码…我还需要相同的功能Hi@Priya,您可以从我的上述编辑中找到简单聊天界面的演示。@mrunalthanki…请在Objective-C中更新。提前感谢您必须创建两个自定义单元格并使用两个数组,一个用于发送方,另一个用于接收方,两个单元格都有不同的单元格identifier正如mrunal和rubin所说,您的问题将得到解决。为单元格创建Nib非常容易,否则您必须维护单个
    UITableViewCell
    ,这将有点复杂。因此,这是所有开发人员对开发人员的建议。我们不能通过代码创建它吗???@JayYa您可以创建,但对您和从我的角度来说,解释每一步都很复杂,那么,如何使用Nib文件,我没有使用Nib或故事板,你能通过代码告诉我如何实现itI吗?我已经更新了答案…但是为什么你想让事情变得困难…如果你能用Nib或故事板来做呢?我从来没有使用过Nib文件。所以,我在问…但我会尝试要使用nibs alosI,请在答案中添加这两项内容。您将需要这两项内容。好的,我会再试一次……谢谢鲁明