2011-01-24 6 views
3

У меня есть UITableView, и я создал пользовательскую ячейку для отображения моей таблицы. У меня отображено 6 UILables, и хотя у меня есть только 20 записей, это очень медленно, когда я прокручиваю.UITableView Custom Cell очень медленно

Это как мой - 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; 
} 

ответ

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]; 
... 
3

Во-первых, вы используете два различных идентификаторов: CustomCellIdentifier и BanciHistoryCellIdentifier.

Во-вторых, вам действительно нужно делать все после NSArray *object; каждый раз, когда отображается новая ячейка? Потому что, если вы этого не сделаете, вы должны переместить его в блок if (cell == nil) {.

+0

На самом деле реальный - это BanciHistoryCellIdentifier, но я переименовал его здесь, чтобы быть CustomCellIdentifier, чтобы быть более понятным для вас, и этот ускользнул от переименования. – CristiC

2

По моему опыту, рисование ячеек таблицы значительно замедляется, если у вас есть три или более подвид (также зависит от устройства и видов). Попробуйте напрямую нарисовать содержимое в drawRect: вместо использования subviews это должно ускорить процесс.

-1

У вас есть CellIdentifier набор в строитель интерфейса? Он должен точно соответствовать тому, что вы используете в коде. Установите точку останова, где она загружает ячейку из наконечника и убедитесь, что она повторно использует ячейки при прокрутке.

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; 
    } 

Go читать documentation о том, как сделать это правильно. Во-вторых, если это слишком долго, чтобы преобразовать даты и числа в строки, тогда вместо этого сохраните значения строк и превратите их в значения, когда вам нужно их модифицировать.

Смежные вопросы