カスタム 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;
}
コードの一部を解析しましたが、主なことは、別のセルからのデータがラベルに挿入されることです。なぜこうなった?