2016-10-22 6 views
0

以下のコードでわかるように、レーサーの時間はtableViewです。最初のレーサーには金色の円(goldMedalイメージ)があり、秒にシルバーと3番目のブロンズがあります。他の人はすべてmedalイメージです。これらの画像は単にゴールド/シルバー/ブロンズ/黒の円です。このメダルイメージにUILabelビューを入れて、レースのレッカーの順位を決める番号を入れたいので、最高の(同じ)タイムを持つレーサーはgoldMedalイメージに番号1を、2番目のレーサーにはsilverMedalイメージそれに番号2を付けています。問題は、私がテーブルビューで非常に多くのレーサーを抱えていて、スクロールダウンすると、レーサーに同じ数字がないことです。その数字はスクロールするときに変化しています。私はそれをどうしたらいいのか分からない。誰でも助けてくれますか?TableViewの再利用可能なセルのindexPath.row番号が間違っています

また、私は、レーサーの数をカウントするために変数を使用しました。それは、より悪いことに、indexPath.rowであり、2つの方法のどれも働いていませんでした。誰でもこの問題をどのように解決するか、彼の見解を少なくとも私に教えてもらえますか?おかげ

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"SKSTableViewCell"; 
    SKSTableViewCell *sksTableViewCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    UILabel *numberLabel = [[UILabel alloc] initWithFrame:CGRectMake(sksTableViewCell.frame.origin.x+22.5, sksTableViewCell.frame.origin.y+20.5, 15, 15)]; 
    numberLabel.font = [UIFont systemFontOfSize:12]; 
    numberLabel.textColor = [UIColor whiteColor]; 
    numberLabel.textAlignment = NSTextAlignmentCenter; 
    numberLabel.adjustsFontSizeToFitWidth = YES; 

    if (!sksTableViewCell) { 
     sksTableViewCell = [[SKSTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil]; 
     sksTableViewCell.backgroundColor = [UIColor clearColor]; 
     if ([[[[ArraySingleton sharedManager].sharedArray objectAtIndex:indexPath.row] times] count]) { 
      sksTableViewCell.expandable = YES; 
     } else { 
      sksTableViewCell.expandable = NO; 
     } 
    } 

    sksTableViewCell.imageView.image = [UIImage imageNamed:@"medal"]; 

    // Medals 
    int golds = [[self.bestThreeRacersDictionary objectForKey:@"golds"] intValue]; 
    int silvers = [[self.bestThreeRacersDictionary objectForKey:@"silvers"] intValue]; 
    int bronzes = [[self.bestThreeRacersDictionary objectForKey:@"bronzes"] intValue]; 

    sksTableViewCell.textLabel.text = [NSString stringWithFormat:@" %@",[[[ArraySingleton sharedManager].sharedArray objectAtIndex:indexPath.row] name]]; 
    numberLabel.text = [NSString stringWithFormat:@"%lu", [Racer shift:golds silvers:silvers bronzes:bronzes]+indexPath.row]; 
    helpIndex++; 
    if (indexPath.row < golds) { 
     sksTableViewCell.imageView.image = [UIImage imageNamed:@"goldMedal"]; 
     numberLabel.text = @"1"; 
     helpIndex--; 
    } else if (indexPath.row < (golds+silvers)) { 
     sksTableViewCell.imageView.image = [UIImage imageNamed:@"silverMedal"]; 
     numberLabel.text = @"2"; 
     helpIndex--; 
    } else if (indexPath.row < (golds+silvers+bronzes)) { 
     sksTableViewCell.imageView.image = [UIImage imageNamed:@"bronzeMedal"]; 
     numberLabel.text = @"3"; 
     helpIndex--; 
    } 
    [sksTableViewCell addSubview:numberLabel]; 

    if ([[[[ArraySingleton sharedManager].sharedArray objectAtIndex:indexPath.row] times] count]) { 
     sksTableViewCell.expandable = YES; 
    } else { 
     sksTableViewCell.expandable = NO; 
    } 
    sksTableViewCell.textLabel.text = [NSString stringWithFormat:@"%@", [[[ArraySingleton sharedManager].sharedArray objectAtIndex:indexPath.row] name]]; 

    return sksTableViewCell; 
} 
+0

あなたは以前の質問から学ばなかった。セル上で 'addSubview:'を何度も何度も呼び出し続けてはいけません。 – rmaddy

+0

'cellForRowAtIndexPath'でサブビューを追加することは決して良い考えではありません。あなたのセルのサブクラスが、イニシャライザでプログラム的に、またはストーリーボードのプロトタイプのセルを通して、ビューを設定するようにする – Paulw11

答えて

0
sksTableViewCell = [[SKSTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 

あなたはここにあなたのCellIdentifierを渡す必要がありそうでない場合は存在しないかではないセルをチェックするのも意味がありません。 UITableViewは常に新しいセルを作成します。

あなたを助けるかもしれないノートの私のカップル:

  1. ご希望の場合は、別の再利用可能な識別子パラメータを使用して識別子に基づいてすることができますが、セルの定義の中の細胞を区別する。

    -(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
    
  2. 次の4つの異なるクラス、ゴールド、シルバー、ブロンズと黒のテーブルのセルの各サブクラスを作成し、それらのすべてを定義して、単に要件に基づいてそれらを呼び出すことができます。それは上下にスクロールしながらあなたがこの仕事を何度も何度もやらなくても、オーバーヘッドを減らすでしょう。将来的には、各セルについてより具体的な作業を行う必要がある場合は、非常に便利です。

  3. 他にもラダーがうまくいかない場合は、最後のものがあります。コードはすぐにこのように比例しなくなり、可読性が大幅に低下します。
0

代わりにcellForRowAtIndexPathで何度も何度もnumberLabelを追加することで、あなたのSKSTableViewCellでそれを追加します。

UILabel *numberLabel = [[UILabel alloc] initWithFrame:CGRectMake(sksTableViewCell.frame.origin.x+22.5, sksTableViewCell.frame.origin.y+20.5, 15, 15)]; 
numberLabel.font = [UIFont systemFontOfSize:12]; 
numberLabel.textColor = [UIColor whiteColor]; 
numberLabel.textAlignment = NSTextAlignmentCenter; 
numberLabel.adjustsFontSizeToFitWidth = YES; 

問題が解決されなければなりません。

関連する問題