2012-02-20 14 views
1

私は[table reloaddata]を呼び出します。セルを再利用すると、セルを完全にクリアするにはどうすればよいですか?

セルは新しいデータで再描画されますが、私のUILabelsは古いUILabels上に描画されているので混乱してしまいます。

static NSString* PlaceholderCellIdentifier = @"PlaceholderCell"; 

UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:PlaceholderCellIdentifier]; 


if (cell == nil) 
{ 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:PlaceholderCellIdentifier] autorelease]; 
    cell.detailTextLabel.textAlignment = UITextAlignmentCenter; 
    cell.selectionStyle = UITableViewCellSelectionStyleNone; 


    cell.contentView.backgroundColor = [UIColor clearColor]; 
} 

私のセルの初期化はですか?

私はそう

 UILabel *theDateLabel = [[UILabel alloc] initWithFrame:CGRectMake(140, 35,140, 20)]; 
    [theDateLabel setBackgroundColor:[UIColor clearColor]]; 
    [theDateLabel setTextColor:[UIColor lightGrayColor]]; 
    [theDateLabel setText:[dateFormatter stringFromDate:theDate]]; 
    [theDateLabel setFont:[UIFont fontWithName:@"TrebuchetMS-Bold" size:15]]; 
    [cell addSubview:theDateLabel]; 
    [theDateLabel release]; 

細胞内のいくつかのより多くのラベル、同じことがありますようにUILabelを追加します。

古いラベルはセルから消えて、もはや見えなくなります。

答えて

10

cellのサブビューとしてtheDateLabelを追加しないでください。サブビューとしてcell.contentViewとして追加する必要があります。

yujiが示唆するように、これを実装する1つの方法は、各カスタムサブビューのプロパティを持つUITableViewCellのサブクラスを作成することです。そうすれば、再利用されたセルの日付ラベルに簡単にアクセスして、新しい行のテキストを設定することができます。

もう1つの一般的な方法は、UIViewにあるtagのプロパティを使用することです。例:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString* PlaceholderCellIdentifier = @"PlaceholderCell"; 
    static const int DateLabelTag = 1; 

    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:PlaceholderCellIdentifier]; 
    if (!cell) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:PlaceholderCellIdentifier] autorelease]; 

     UILabel *theDateLabel = [[UILabel alloc] initWithFrame:CGRectMake(140, 35,140, 20)]; 
     theDateLabel.tag = DateLabelTag; 
     theDateLabel.backgroundColor = [UIColor clearColor]; 
     theDateLabel.textColor = [UIColor lightGrayColor]; 
     theDateLabel.font = [UIFont fontWithName:@"TrebuchetMS-Bold" size:15]; 
     [cell.contentView addSubview:theDateLabel]; 
     [theDateLabel release]; 
    } 

    NSDate *theDate = [self dateForRowAtIndexPath:indexPath]; 
    UILabel *theDateLabel = [cell.contentView viewWithTag:DateLabelTag]; 
    theDateLabel.text = [dateFormatter stringFromDate:theDate]; 

    return cell; 
} 
+0

+1は簡単で迅速な解決方法です。また、cellView自体の代わりにcontentViewを推奨することは、しばしば間違って行われるため、非常に貴重です(tableView編集モードなどを使用すると醜い結果につながります)。 – Till

5

リチャードのソリューションは機能しますが、セルに他のサブビューがある場合は削除されます。また、セルを描画するたびにサブビューを割り当てて初期化することは必ずしも最適ではありません。

ここでの標準的な解決策は、UITableViewCellというサブクラスを作成し、プロパティ@dateLabel(その他のラベルの場合も同様)を作成することです。その後、セルを初期化するときに、まだ@dateLabelがない場合は、新しいセルを与えることができます。それ以外の場合は、テキストを設定するだけです。

+0

これはすばらしい答えです。 –

+0

私の答え、良い考えよりはるかに良いアプローチ! +1 –