uitableviewカスタムセルは非常に遅いです
-
24-10-2019 - |
質問
私は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;
}
解決
Formatterオブジェクトの作成とセットアップは確かに高価な操作であるため、各関数呼び出しで同じであるため、フォーマッタオブジェクトを再利用することから始めます。したがって、データソースクラスの静的変数またはインスタント変数を作成し、次の方法を作成します。
//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];
...
他のヒント
まず、2つの異なる識別子を使用しています。 CustomCellIdentifier
と BanciHistoryCellIdentifier
.
第二に、あなたは本当に後にすべてをする必要がありますか NSArray *object;
新しいセルが表示されるたびに?そうでない場合は、 if (cell == nil) {
ブロック。
私の経験から、3つ以上のサブビューがある場合、テーブルビューセルの描画は大幅に遅くなります(ただし、デバイスとビューにも依存します)。 DrawRectでコンテンツを直接描画するようにしてください:サブビューを使用する代わりに、これにより物事がスピードアップされるはずです。
あなたはここで何をしているの:
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;
}
読んでください ドキュメンテーション これを適切に行う方法について。第二に、これが日付と数字を文字列に変換するのに時間がかかりすぎて、代わりに文字列値を保存し、それらを変更する必要があるときにそれらを値に変える。
Interface BuilderにCellidentifierが設定されていますか?コードで使用しているものと正確に一致する必要があります。ペルからセルをロードする場所にブレークポイントを設定し、スクロールするときにセルが再利用されていることを確認します。