3

UITableView があり、テーブルを表示するカスタム セルを作成しました。6 つの UILables を表示しています。表示するレコードは 20 個しかありませんが、スクロールすると非常に遅くなります。

これが私の方法です - tableView: cellForRowAtIndexPath: は次のようになります:

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

    static NSString *CustomCellIdentifier = @"CustomCellIdentifier";

    HistoryCell *cell = (HistoryCell *)[tableView dequeueReusableCellWithIdentifier: CustomCellIdentifier];

    if (cell == nil) { 
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"HistoryCell" owner:nil options:nil];

        for (id oneObject in nib)
            if ([oneObject isKindOfClass:[UITableViewCell class]])
                cell = (HistoryCell *) oneObject;
    }

    NSArray *object;
    object = [cours objectForKey: [NSString stringWithFormat:@"%d", indexPath.section]];
    History *rowData = [object objectAtIndex:indexPath.row];

    if (rowData.month == 99) {
        cell.hour.frame = CGRectMake(10, 0, 135, 35);
        cell.data.hidden = YES;
        cell.hour.textColor = [UIColor blackColor];
        cell.hour.font = [UIFont fontWithName:@"Verdana" size:17];
    } else {
        cell.data.hidden = NO;
        cell.hour.frame = CGRectMake(10, 16, 135, 19);
        cell.hour.textColor = [UIColor grayColor];
        cell.hour.font = [UIFont fontWithName:@"Verdana" size:12];
    }

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"d (EEEE)"];
    [formatter setLocale:self.selectedLanguageLocale];
    NSString *stringFromDate = [formatter stringFromDate:rowData.data];
    [formatter release];

    cell.data.text = stringFromDate;
    cell.hour.text = rowData.ora;

    float Var1  = [rowData.Var2 floatValue];
    float Var2  = [rowData.Var2 floatValue];

    cell.R1.text = [self floatToStringFormat: [rowData.R1 floatValue]];
    cell.R2.text = [self floatToStringFormat: [rowData.R2 floatValue]];

    if (Var1 <= 0) {
        cell.Var1.textColor = [UIColor greenColor];
    } else {
        cell.Var1.textColor = [UIColor redColor];
    }
    if (Var2 <= 0) {
        cell.Var2.textColor = [UIColor greenColor];
    } else {
        cell.Var2.textColor = [UIColor redColor];
    }
    cell.Var1.text = [self floatToStringFormat:Var1];
    cell.Var2.text = [self floatToStringFormat:Var2];

    cell.selectionStyle = UITableViewCellSelectionStyleGray;
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

    return cell;
}

スクロールが遅くなる理由は、ここで行っているすべてのこと (NSDateFormatter、CGMakeRect、floatToStringFormat...) が原因でしょうか、それともセルの再利用に何か問題がありますか?

floatToStringFormat は、数値を 4 桁にフォーマットする関数です。

- (NSString *)floatToStringFormat:(float)number{
    NSNumberFormatter *myFloat = [[NSNumberFormatter alloc] init]; 
    [myFloat setFormatterBehavior:NSNumberFormatterBehavior10_4]; 
    [myFloat setNumberStyle:NSNumberFormatterDecimalStyle];
    [myFloat setRoundingMode:NSNumberFormatterRoundHalfUp];
    [myFloat setMinimumFractionDigits:4];
    [myFloat setMaximumFractionDigits:4];
    NSString *res = [myFloat stringFromNumber:[NSNumber numberWithFloat:number]];
    [myFloat release];
    return res;
}
4

5 に答える 5

6

フォーマッタ オブジェクトの作成と設定は確かにコストのかかる操作です。フォーマッタ オブジェクトは各関数呼び出しで同じであるため、フォーマッタ オブジェクトを再利用することから始めます。したがって、データ ソース クラスで静的変数またはインスタント変数を作成し、次のように作成します。

//static variable case
NSDateFormatter *formatter = nil;
if (!formatter){
   formatter = [[NSDateFormatter alloc] init];
   [formatter setDateFormat:@"d (EEEE)"];
   [formatter setLocale:self.selectedLanguageLocale];
}
NSString *stringFromDate = [formatter stringFromDate:rowData.data];
...
于 2011-01-24T18:53:38.347 に答える
3

CustomCellIdentifierまず、との 2 つの異なる識別子を使用していますBanciHistoryCellIdentifier

NSArray *object;第二に、新しいセルが表示されるたびに、本当にすべてを行う必要がありますか? そうしない場合は、if (cell == nil) {ブロックに移動する必要があるためです。

于 2011-01-24T18:49:26.533 に答える
2

私の経験から、サブビューが 3 つ以上ある場合、テーブル ビュー セルの描画は大幅に遅くなります (ただし、デバイスとビューにも依存します)。サブビューを使用する代わりに、drawRect でコンテンツを直接描画してみてください。これにより、速度が向上するはずです。

于 2011-01-24T18:51:24.343 に答える
0

あなたはここで何をしているの:

if (cell == nil) { 
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"HistoryCell" owner:nil options:nil];

        for (id oneObject in nib)
            if ([oneObject isKindOfClass:[UITableViewCell class]])
                cell = (HistoryCell *) oneObject;
    }

これを適切に行う方法については、ドキュメントを参照してください。第 2 に、日付と数値を文字列に変換するのに時間がかかりすぎる場合は、代わりに文字列値を保存し、変更する必要があるときにそれらを値に変換します。

于 2011-01-24T19:58:31.967 に答える
-1

Interface builder で CellIdentifier を設定していますか? コードで使用しているものと正確に一致する必要があります。ペン先からセルをロードするブレークポイントを設定し、スクロール時にセルが再利用されていることを確認します。

于 2011-01-24T18:59:05.797 に答える