0

これはチャットアプリです。テーブルビューを使用してユーザーと他のユーザー間のチャットデータを表示していますが、行が複数(重複)表示されています。コードは以下のとおりです。

#define kMyTag 1

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{   
    NSDictionary *messageDic = [self.chatArray objectAtIndex:indexPath.row];
    if ([[messageDic objectForKey:@"myself"]boolValue] == false) {
        static NSString *CellIdentifier = @"MessageChatFriendCell"; 
        MessageChatFriendCell *cell = (MessageChatFriendCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            cell = [[MessageChatFriendCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        }
        NSDictionary *chatInfo = [self.chatArray objectAtIndex:[indexPath row]];
        UIView *chatView = [chatInfo objectForKey:@"view"];
        chatView.tag = kMyTag;
        [cell.contentView addSubview:chatView];
        return cell;
    } else  {
        static NSString *CellIdentifier = @"MessageChatSelfCell";
        MessageChatSelfCell *cell = (MessageChatSelfCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            cell = [[MessageChatSelfCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        }
        NSDictionary *chatInfo = [self.chatArray objectAtIndex:[indexPath row]];
        UIView *chatView = [chatInfo objectForKey:@"view"];
        chatView.tag = kMyTag;
        [cell.contentView addSubview:chatView];
        return cell;
    }
}

各行の出力結果は次のとおりです。

2012-08-02 15:44:47.152  MessageChatSelfCell-><UIView: 0x222790; frame = (85 0; 230 114); tag = 1; layer = <CALayer: 0x222320>>
2012-08-02 15:44:47.166  MessageChatFriendCell-><UIView: 0x21d790; frame = (0 0; 210 132); tag = 1; layer = <CALayer: 0x21d5c0>>
2012-08-02 15:44:47.176  MessageChatFriendCell-><UIView: 0x21bde0; frame = (0 0; 177 60); tag = 1; layer = <CALayer: 0x21be10>>
2012-08-02 15:44:47.183  MessageChatSelfCell-><UIView: 0x216430; frame = (85 0; 230 168); tag = 1; layer = <CALayer: 0x215fc0>>
2012-08-02 15:44:59.232  MessageChatFriendCell-><UIView: 0x215150; frame = (0 0; 86 60); tag = 1; layer = <CALayer: 0x214eb0>>
2012-08-02 15:45:00.465  MessageChatSelfCell-><UIView: 0x213220; frame = (85 0; 230 78); tag = 1; layer = <CALayer: 0x213250>>

アドバイスしてください、ありがとう!

2012-08-08 更新

#define WRITER_NAME_LABEL_TAG 4
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{   
    static NSString *MessageChatSelfCellIdentifier = @"MessageChatSelfCell";    
    static NSString *MessageChatFriendCellIdentifier = @"MessageChatFriendCell";
    UITableViewCell *cell = nil;
    UIView *chatView = nil;
    NSDictionary *messageDic = [self.chatArray objectAtIndex:indexPath.row];
    NSString *text = [messageDic objectForKey:@"compiled"];
    BOOL myMessage = [[messageDic objectForKey:@"myself"] boolValue];

    if (myMessage) {
        cell = [tableView dequeueReusableCellWithIdentifier:MessageChatSelfCellIdentifier];

        if(cell == nil) 
        { 
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle
                                           reuseIdentifier:MessageChatSelfCellIdentifier];

        chatView = [self bubbleView:[NSString stringWithFormat:@"%@", text] 
                                       from:YES];
        chatView.tag = WRITER_NAME_LABEL_TAG;
        NSLog(@"MessageChatFriendCell->%@",chatView);
        [cell addSubview:chatView];
        }else {
            chatView = (UIView *)[cell viewWithTag:WRITER_NAME_LABEL_TAG];
        }
    } else  {
        cell = [tableView dequeueReusableCellWithIdentifier:MessageChatFriendCellIdentifier];

        if(cell == nil) 
        { 
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle
                                          reuseIdentifier:MessageChatFriendCellIdentifier];

        NSString *text = [messageDic objectForKey:@"compiled"];        
        UIView *chatView = [self bubbleView:[NSString stringWithFormat:@"%@", text] 
                                       from:NO];
        chatView.tag = WRITER_NAME_LABEL_TAG;
                NSLog(@"MessageChatSelfCell->%@",chatView);
        [cell addSubview:chatView];
        }else {
            chatView = (UIView *)[cell viewWithTag:WRITER_NAME_LABEL_TAG];
        }
    }  
        return cell;
}
4

2 に答える 2

0

変更すべき点はほとんどありません。まず、ビューを chatInfo に保存せずに、データを保存してください。
次に、新しいセルを作成するときにのみセルにビューを追加します。それ以外の場合は、再利用されたセルに複数のビューを追加します。
以下の例を見てください。ここでは、メッセージ ライター名のセルを作成しています。私のメッセージではライター名が右側に表示され、友人のメッセージでは左側に表示されます。新しいセルを作成するときにライター名ラベルを追加するだけであることに注意してください。次にタグを付けて、次に変更したいときにラベルを取得できるようにします。

#define WRITER_NAME_LABEL_TAG 1

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *MessageChatFriendCellIdentifier = @"MessageChatFriendCell";
    static NSString *MessageChatSelfCellIdentifier = @"MessageChatSelfCell";

    UITableViewCell *cell = nil;
    UILabel *writerNameLabel = nil;

    NSDictionary *messageInfo = [self.chatArray objectAtIndex:indexPath.row];
    BOOL myMessage = [[messageInfo objectForKey:@"myself"] boolValue];

    if (myMessage) {        
        // this is my message
        cell = [tableView dequeueReusableCellWithIdentifier:MessageChatSelfCellIdentifier];

        if(cell == nil) 
        { 
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle
                                           reuseIdentifier:MessageChatSelfCellIdentifier] autorelease];

            writerNameLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 300, 20)];
            writerNameLabel.tag = WRITER_NAME_LABEL_TAG;
            writerNameLabel.textAlignment = UITextAlignmentRight;
            [cell addSubview:writerNameLabel];
        }
        else {
            writerNameLabel = (UILabel *)[cell viewWithTag:WRITER_NAME_LABEL_TAG];
        }
    }
    else {
        // this is my friend message
        cell = [tableView dequeueReusableCellWithIdentifier:MessageChatFriendCellIdentifier];

        if(cell == nil) 
        { 
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle 
                                           reuseIdentifier:MessageChatFriendCellIdentifier] autorelease];

            writerNameLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 300, 20)];
            writerNameLabel.tag = WRITER_NAME_LABEL_TAG;
            writerNameLabel.textAlignment = UITextAlignmentLeft;
            [cell addSubview:writerNameLabel];
        }
        else {
            writerNameLabel = (UILabel *)[cell viewWithTag:WRITER_NAME_LABEL_TAG];
        }
    }

    // get the current writer name from the model
    NSString *writerName = [messageInfo objectForKey:@"writer"];        

    // configure cell...
    writerNameLabel.text = writerName;

    return cell;
}
于 2012-08-02T10:41:18.483 に答える
0

私はあなたの別の質問に答えましたUILabelでNSStringの幅と高さを計算する方法

それらは同様の問題です。以下のコードは、他の質問からの C&P です。

これは、表のセルを再利用しなかったためです。構造は次のようになります。

NSString *text = [messageInfo objectForKey:@"compiled"];
if(cell == nil) 
        { 
     writerNameLabel.numberOfLines = 0;
     writerNameLabel.textAlignment = UITextAlignmentRight;
     writerNameLabel.backgroundColor = [UIColor clearColor];
     [cell addSubview:writerNameLabel];
}
else {
     writerNameLabel = (UILabel *)[cell viewWithTag:WRITER_NAME_LABEL_TAG];
}
CGSize constraint = CGSizeMake(296,9999);
CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] 
               constrainedToSize:constraint 
                   lineBreakMode:UILineBreakModeWordWrap];
[writerNameLabel setFrame:CGRectMake(writerNameLabel.frame.origin.x, writerNameLabel.frame.origin.y, size.width, size.height)];

私はあなたの質問のいくつかを調べて答えました。それはあなたのテーブルビューコントローラーを書く正しい方法です。そして、あなたの問題は解決されます。

于 2012-08-20T06:29:29.580 に答える