UitableView Custom Cell очень медленная
-
24-10-2019 - |
Вопрос
У меня есть UitableView, и я создал пользовательскую ячейку для отображения своей таблицы. У меня отображается 6 Uilables, и хотя у меня есть только 20 записей, это очень медленно, когда я прокручиваю.
Вот как мой - таблица: cellforroworatindexpath: выглядит как:
- (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 - это действительно дорогая операция, поэтому я бы начал с повторного использования ваших объектов 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];
...
Другие советы
Во -первых, вы используете два разных идентификатора: CustomCellIdentifier
а также BanciHistoryCellIdentifier
.
Во -вторых, вам действительно нужно делать все после NSArray *object;
Каждый раз, когда отображается новая ячейка? Потому что, если вы этого не сделаете, вы должны переместить его в if (cell == nil) {
блокировать.
Исходя из моего опыта, рисунок ячеек View View значительно замедляется, если у вас есть три или более подвесок (также зависит от устройства и представлений). Попробуйте напрямую нарисовать контент в 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;
}
Иди читать документация о том, как сделать это правильно. Во -вторых, если это займет слишком много времени, чтобы преобразовать даты и числа в строки, вместо этого храните значения строк и превратите их в значения, когда вам нужно их модифицировать.
У вас есть набор CellIdentifier в интерфейсном застройке? Он должен соответствовать именно тому, что вы используете в коде. Установите точку останова, где он загружает ячейку из печи, и убедитесь, что она повторно использует ячейки при прокрутке.