2011-07-21 8 views
0

私のアプリケーションでは、私はUITableViewCellをカスタマイズし、そのcontentViewプロパティを使用しています。 しかし、今問題は、細胞内のデータが異なる細胞に入ることがあることです。例:セル3のデータは、下にスクロールするかスクロールするときにセル8または9に入ります。これが原因で(あなたがとにかく持っている必要があります)このラインの起こっているなぜUITableViewCellは単一セルで値を変更しますか?

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

    static NSString *CellIdentifier = @"Cell"; 
    CGFloat fontSize = [UIFont systemFontSize]; 
    CGFloat smallFontSize = [UIFont smallSystemFontSize]; 
    UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier]autorelease]; 
     mainLabel = [[[UILabel alloc] initWithFrame:CGRectMake(5,0,150,42)] autorelease]; 
     mainLabel.font = [UIFont systemFontOfSize:smallFontSize]; 
     mainLabel.numberOfLines = 3; 
     mainLabel.lineBreakMode = UILineBreakModeWordWrap; 
     mainLabel.backgroundColor = [UIColor clearColor]; 
     mainLabel.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleHeight; 
     [cell.contentView addSubview:mainLabel]; 

     secondLabel = [[[UILabel alloc] initWithFrame:CGRectMake(160,0,160,42)] autorelease]; 
     secondLabel.font = [UIFont systemFontOfSize:smallFontSize]; 
     secondLabel.numberOfLines = 3; 
     secondLabel.lineBreakMode = UILineBreakModeWordWrap; 
     secondLabel.backgroundColor = [UIColor clearColor]; 
     secondLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight; 
     [cell.contentView addSubview:secondLabel]; 


    } 
    cell.accessoryType = UITableViewCellAccessoryNone; 
    cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    cell.textLabel.font = [UIFont systemFontOfSize:smallFontSize]; 
    cell.detailTextLabel.font = [UIFont systemFontOfSize:smallFontSize]; 
    NSArray * titles = [[NSArray alloc] initWithObjects:@"Project ID", @"Status", @"Approval Date", @"Closing Date", @"Country",@"Region Name", @"Env", @"Team Full Name",@"Borrower", @"Impagency", @"Lending Cost", @"IBRDPlus", nil]; 

    switch (indexPath.section) { 
     case 0: 

      mainLabel.text = [titles objectAtIndex:indexPath.row]; 
      mainLabel.adjustsFontSizeToFitWidth = YES; 
      mainLabel.numberOfLines = 4; 
      mainLabel.lineBreakMode = UILineBreakModeWordWrap; 

      secondLabel.text = [self.basic objectAtIndex:indexPath.row]; 
      secondLabel.adjustsFontSizeToFitWidth = YES; 
      secondLabel.numberOfLines = 4; 
      secondLabel.lineBreakMode = UILineBreakModeWordWrap; 
      break; 
     case 1: 

      mainLabel.text = [[self.allSectors objectAtIndex:indexPath.row] valueForKey:@"SECTORNAME"]; 
      mainLabel.adjustsFontSizeToFitWidth = YES; 
      mainLabel.numberOfLines = 4; 
      mainLabel.lineBreakMode = UILineBreakModeWordWrap; 

      secondLabel.text = [[self.allSectors objectAtIndex:indexPath.row] valueForKey:@"SECTORPCT"]; 
      secondLabel.adjustsFontSizeToFitWidth = YES; 
      secondLabel.numberOfLines = 4; 
      secondLabel.lineBreakMode = UILineBreakModeWordWrap; 

      break; 
     case 2: 

      mainLabel.text = [[self.themes objectAtIndex:indexPath.row] valueForKey:@"THEME_NAME"]; 
      mainLabel.adjustsFontSizeToFitWidth = YES; 
      mainLabel.numberOfLines = 4; 
      mainLabel.lineBreakMode = UILineBreakModeWordWrap; 

      secondLabel.text = [[self.themes objectAtIndex:indexPath.row] valueForKey:@"THEMEPCT"]; 
      secondLabel.adjustsFontSizeToFitWidth = YES; 
      secondLabel.numberOfLines = 4; 
      secondLabel.lineBreakMode = UILineBreakModeWordWrap; 

      break; 

     default: 
      break; 
    } 

    return cell; 
} 
+0

私の更新された回答を参照してください。これは問題を解決するはずです。 –

答えて

1

:基本的には

UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:CellIdentifier]; 

細胞は、コンテンツの滞在を再利用されているため はここでcellForRowAtIndexPathで使用してIAMコードですしたがって、デキューした後にそのセルをきれいにしてから、新しいcontentViewを設定する必要があります。

特にあなたがここにあなたの変数を設定しているときに、 secondLabelのテキストをリセットしているにもかかわらず、ということで、ここで起こるとは何

:作成された

secondLabel = [[[UILabel alloc] initWithFrame:CGRectMake(160,0,160,42)] autorelease]; 

最後のセルがsecondLabelが指しているものすべて本当にいつも同じラベルを変更しているので、私は次のようなものを提案しています。

UILabel *lblCell; 
for (id label in [cell.contentView subviews]) { 
      if ([label isKindOfClass:[UILabel class]]) { 
       lblCell = label; 
      } 
     } 

lblCell.text = [[self.themes objectAtIndex:indexPath.row] valueForKey:@"THEMEPCT"]; 

希望します。

+0

私はこれを正確に理解していません。もしあなたが正確に私がこのループを使用する必要がある場所とlblCellを置き換える必要がある場所を詳しく教えてください。 – Ashutosh

+0

@Ashutoshループは、デクセルされたcell contentViewラベルへのポインタを取得するだけで、変更できるので、ラベルのテキストを変更するたびにこれを行う必要があります。 –

+0

私はまだこれを置く場所を取得しません。私の新しい、これは私がセルをカスタマイズしている初めてです。だから、私のコードを編集するだけで、それを正しく理解することができます。 – Ashutosh

関連する問題