1

カスタムのテーブルビューセルを使用してメッセージを送信するために、アプリにテーブルビューがあります。このテーブルビューには、JSON からの配列が取り込まれます。メッセージが未読の場合に青い点の画像を表示するセルに UIImageView があります。

ここにいくつかのコードがあります:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:YES];
    messagesArray = [self getMessages];
    [messagesTableView reloadData];
}

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

    NSDictionary *messagesDictionary = [messagesArray objectAtIndex:indexPath.row];

    UILabel *nameLabel = (UILabel *)[cell viewWithTag:100];     
    nameLabel.text = [messagesDictionary objectForKey:@"fromUserName"];

    UIImageView *readImage = (UIImageView *)[cell viewWithTag:103];
    NSNumber *boolNumber = [messagesDictionary valueForKey:@"readFlag"];
    BOOL read = [boolNumber boolValue];

    if (!read)
        readImage.image = [UIImage imageNamed:@"Message Read Circle"];

    return cell;
}

メッセージが選択されると、サーバーにメッセージを送信してメッセージが既読であることを知らせますが、戻っても未読の画像が残っています。シミュレーターでアプリを終了し、アプリをリロードすると、選択したメッセージから未読の画像が消えているため、既読メッセージとしてマークが通過していることがわかります。うまくいかないのはなぜ[messagesTableView reloadData]ですか?

4

2 に答える 2

3

テーブル ビューのセルは再利用されるため、場合に限らず、どのような場合でも画像を設定する必要がありますread == NO。何かのようなもの:

if (read)
    readImage.image = [UIImage imageNamed:@"Message Read Circle"];
else
    readImage.image = [UIImage imageNamed:@"Message Unread Circle"];
于 2013-09-04T21:08:54.297 に答える
1

あなたが言ったように、viewDidAppearのテーブルビューでreloadDataを実際に呼び出しているようには見えません。

また、Mike Z が上記で尋ねたように、getMessages 呼び出しのタイミングに問題がある可能性があります。このメソッドは同期ですか、それとも非同期ですか? そのコードの一部を投稿することも役立つ場合があります。

また、メッセージが既読の場合は readImage を nil に設定する必要があります。これらのセルはデキューされるため、read プロパティの true と false の両方の状態に対して imageView を設定しないと、誤った結果が得られる可能性があることに注意してください。

于 2013-09-04T21:12:32.253 に答える