1

カスタム UITableViewCell を再利用すると、現在のセルのすべてのデータがリセットされません。再利用されたセルのデータが特定の UILabel に挿入されます。

私は料理のテーブルビューを持っています。料理にはコメントがあります。tableviewcell 内の各料理のコメントを表示したいと思います。コメントの数に応じて、各セルにその数のコメント ラベルのみを作成します。ただし、セルを再利用すると、間違ったコメント (別の Dish からのコメント) が表示されます。

私は CoreData を使用しており、ディッシュには多くのコメントがあり、最初の 2 つのコメントのみを表示したいとしましょう。

各コメントの長さに合わせてサイズが変更されるように、高さと幅がゼロの IB に 2 つの UILabels を作成しました。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath    *)indexPath
{
    DishCell *cell = [tableView dequeueReusableCellWithIdentifier:@"DishCell"];
    [self configureCell:cell atIndexPath:indexPath];
    return cell;
}

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{ ...I put all of the Dishes in a NSFetchedResultsController instance so *dish is a NSManagedObject that has many comments

      NSSet *commentsSet = dish.comments;
      NSSortDescriptor *sortByDate = [[NSSortDescriptor alloc]initWithKey:@"date"  ascending:YES];
      NSArray *commentArray = [commentsSet sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortByDate]];

     if (commentsSet.count< 1) {
        dishCell.comment1label.text = @"";
        dishCell.comment2label.text = @"";
     }else {

    Comment *comment = [commentArray objectAtIndex:0];

    NSString *commenterName = comment.displayName;
    NSString *commentString = comment.commentText;
    NSString *text = [NSString stringWithFormat:@"%@: %@", commenterName, commentString];

    CGSize comment1Size = [text sizeWithFont:[UIFont systemFontOfSize:10.0f] constrainedToSize:CGSizeMake(constraint.width - dishCell.commentBubble.frame.size.width + 4, constraint.height) lineBreakMode:UILineBreakModeWordWrap];

    //Ignore this setFrame - it works
    [dishCell.comment1label setFrame:CGRectMake(32, faveIconYpos - 2 + dishCell.favIcon.frame.size.height, 298 - dishCell.commentBubble.frame.size.width, comment1Size.height + 2)];

    dishCell.text = text;

    if (commentsSet.count > 1) {
        Comment *comment2 = [commentArray objectAtIndex:1];
        [dishCell.comment2label setTextColor:[UIColor whiteColor]];
        [dishCell.comment2label setFont:[UIFont systemFontOfSize:12.0]];

        NSString *text2 = [NSString stringWithFormat:@"%@: %@", comment2.displayName, comment2.commentText];

        CGSize comment2Size = [text2 sizeWithFont:[UIFont systemFontOfSize:10.0f] constrainedToSize:CGSizeMake(constraint.width - dishCell.commentBubble.frame.size.width + 4, constraint.height) lineBreakMode:UILineBreakModeWordWrap];
        [dishCell.comment2label setFrame:CGRectMake(32, faveIconYpos + dishCell.favIcon.frame.size.height + dishCell.testcom.frame.size.height - 2, 298 - dishCell.commentBubble.frame.size.width, comment2Size.height + 2)];
        dishCell.comment2label.text = text2; 
    }

コードの一部を解析しましたが、主なことは、別のセルからのデータがラベルに挿入されることです。なぜこうなった?

4

0 に答える 0