2010-12-14 5 views
0

私はスクロールテーブルを持っています。 各セルに3つのUILabelsを描きます。最初のいくつかの細胞は大丈夫です。しかし、テーブルを下にスクロールすると、UILabelsは以前のUILabelsを引き継いでいるようです。セル内のラベルのように、そこには既にクリアされた古いラベルがあります。私はおそらくこれを、それぞれの再描画のセル全体に背景色を描くことで解決できるかもしれませんが、それでもまだこの奇妙な問題とその理由を説明していません。再描画の問題を持つスクロール可能なテーブル。 doesntは消しているようです

これがなぜ発生するのか、何が解決策であるのか、誰にも分かりますか?

- (UITableViewCell *)tableView:(UITableView *)tableView 
cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
static NSString *CellIdentifier = @"Cell";  
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) 
{ 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
reuseIdentifier:CellIdentifier] autorelease]; 
} 

Match *aMatch = [appDelegate.matchScoresArray objectAtIndex:indexPath.row]; 

UILabel * teamName1Label = [[UILabel alloc]initWithFrame:CGRectMake(5,5, 100, 20)]; 
teamName1Label.textAlignment = UITextAlignmentCenter; 
teamName1Label.textColor = [UIColor redColor]; 
teamName1Label.backgroundColor = [UIColor clearColor]; 
teamName1Label.text = aMatch.teamName1; 
[cell addSubview:teamName1Label]; 

UILabel *teamVersusLabel = [[UILabel alloc]initWithFrame:CGRectMake(115,5, 40, 20)]; 
teamVersusLabel.textAlignment = UITextAlignmentCenter; 
teamVersusLabel.textColor = [UIColor redColor]; 
teamVersusLabel.backgroundColor = [UIColor clearColor]; 
teamVersusLabel.text = @"V"; 
[cell addSubview:teamVersusLabel]; 


UILabel *teamName2Label = [[UILabel alloc]initWithFrame:CGRectMake(155,5, 100, 20)]; 
teamName2Label.textAlignment = UITextAlignmentCenter; 
teamName2Label.textColor = [UIColor redColor]; 
teamName2Label.backgroundColor = [UIColor clearColor]; 
teamName2Label.text = aMatch.teamName2; 
[cell addSubview:teamName2Label]; 

return cell; 
} 

多くのおかげ -code

答えて

4

私はこの問題に対する最善の解決策は にこれらのラベルを定義することだと思う - (UITableViewCellの*)reuseTableViewCellWithIdentifier:(NSStringの*)識別子withIndexPath:(NSIndexPath *)indexPath方法今

-(UITableViewCell *)reuseTableViewCellWithIdentifier:(NSString *)identifier withIndexPath:(NSIndexPath *)indexPath{ 
UITableViewCell *cell =[[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]autorelease]; 

UILabel * teamName1Label = [[UILabel alloc]initWithFrame:CGRectMake(5,5, 100, 20)]; 
teamName1Label.textAlignment = UITextAlignmentCenter; 
teamName1Label.textColor = [UIColor redColor]; 
teamName1Label.backgroundColor = [UIColor clearColor]; 
teamName1Label.text = aMatch.teamName1; 
teamName1Label.tag = 1; 
[cell.contentView addSubview:teamName1Label]; 
[teamName1Label release]; 

UILabel *teamVersusLabel = [[UILabel alloc]initWithFrame:CGRectMake(115,5, 40, 20)]; 
teamVersusLabel.textAlignment = UITextAlignmentCenter; 
teamVersusLabel.textColor = [UIColor redColor]; 
teamVersusLabel.backgroundColor = [UIColor clearColor]; 
teamVersusLabel.text = @"V"; 
teamVersusLabel.tag = 2; 
[cell.contentView addSubview:teamVersusLabel]; 
[teamVersusLabel release]; 


UILabel *teamName2Label = [[UILabel alloc]initWithFrame:CGRectMake(155,5, 100, 20)]; 
teamName2Label.textAlignment = UITextAlignmentCenter; 
teamName2Label.textColor = [UIColor redColor]; 
teamName2Label.backgroundColor = [UIColor clearColor]; 
teamName2Label.text = aMatch.teamName2; 
teamName2Label.tag = 3; 
[cell.contentView addSubview:teamName2Label]; 
[teamName2Label release]; 

return cell; 
} 

cellForRowAtIndexPathメソッドは、それが役立ちます:)

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

    UITableViewCell *cell=nil; 

    static NSString *Identifier = @"Cell"; 
    cell = [theTableView dequeueReusableCellWithIdentifier:Identifier]; 
    if(cell == nil){ 
    cell = [self reuseTableViewCellWithIdentifier:Identifier withIndexPath:indexPath]; 
    } 

    Match *aMatch = [appDelegate.matchScoresArray objectAtIndex:indexPath.row]; 

    UILabel *label = (UILabel *)[cell.contentView viewWithTag:1]; 
    label.text = aMatch.teamName1; 

    label = (UILabel *)[cell.contentView viewWithTag:2]; 
    label.text = @"V"; 

    label = (UILabel *)[cell.contentView viewWithTag:3]; 
    label.text = aMatch.teamName2; 

    return cell; 
    } 

はちょうどこのcode..Hopeを試してみてくださいbe--ます

0

これは、セルの再利用の問題です。このコードは、cellForRowAtIndexPathが呼び出されるたびに(セルがnilでなくても)ラベルをセルに追加しています。

スクロールすると、すでにラベルを持つ前のセルが読み込まれ、古いラベルに新しいラベルが追加されます。

if (cell == nil)セクションのセルにラベルを作成して追加するだけです。ラベルを作成するときは、ラベルにタグを設定します。

次に、ifの外側では、viewWithTagを使用してタグを使用してラベルを取得し、テキストを設定します。