проблемы медленной прокрутки табличного представления - PullRequest
1 голос
/ 05 декабря 2011

Я использую 5 меток, 1 кнопку, 1 вид изображения в пользовательских ячейках табличного представления. Но при запуске моей программы прокрутка таблицы происходит медленно, а некоторые метки переопределяются. Как можно улучшить производительность прокрутки таблицы моего кода как следовать Спасибо.

 #define NAMELABEL_TAG 1
 #define VALUELABEL_TAG 2
 #define MYPRICELABEL_TAG 3
 #define SAVEPRICELABEL_TAG 4
 #define PRODUCTIMAGELABEL_TAG 5
 #define VLABEL_TAG 6
 #define YLABEL_TAG 7
 #define SLABEL_TAG 8

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


UILabel *nameLabel,*valueLabel,*myPriceLabel,*savePriceLabel,*vLabel,*yLabel,*sLabel;
UIImageView *productImage;
static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];



///my code....

 //CONFIGURE THE SLabel LABEL
 sLabel=[[[UILabel alloc]initWithFrame:CGRectMake(60, 32, 80, 32)]autorelease];
 sLabel.tag=SLABEL_TAG;
 //yLabel.textColor=[UIColor redColor];
 sLabel.font=[UIFont systemFontOfSize:12.0];

 //ADD THE LABEL TO CELLS CONTENT VIEW
 [cell.contentView addSubview:sLabel];


 //CONFIGURE THE YNAME LABEL
 yLabel=[[[UILabel alloc]initWithFrame:CGRectMake(185, 18, 80, 18)]autorelease];
 yLabel.tag=NAMELABEL_TAG;
 //yLabel.textColor=[UIColor redColor];
 yLabel.font=[UIFont systemFontOfSize:12.0];
 //ADD THE LABEL TO CELLS CONTANT VIEW
 [cell.contentView addSubview:yLabel];

 //CONFIGURE THE NAME LABEL
 nameLabel=[[[UILabel alloc]initWithFrame:CGRectMake(60, 0, 140, 20)]autorelease];
 nameLabel.tag=NAMELABEL_TAG;
 nameLabel.textColor=[UIColor redColor];
 //ADD THE LABEL TO CELLS CONTANT VIEW
 [cell.contentView addSubview:nameLabel];
 //configure the value label
 valueLabel=[[[UILabel alloc]initWithFrame:CGRectMake(112, 18, 60, 18)]autorelease];
 valueLabel.tag=VALUELABEL_TAG;
 valueLabel.font=[UIFont systemFontOfSize:12.0];
    //valueLabel.font=[UIFont fontWithName:@"verdana" size:12.0];
    //valueLabel.text=[UIFont 
 valueLabel.textColor=[UIColor redColor];
 [cell.contentView addSubview:valueLabel];

 //CONFIGURE THE myprice LABEL
 myPriceLabel=[[[UILabel alloc]initWithFrame:CGRectMake(262, 18, 40, 18)]autorelease];
 myPriceLabel.tag=MYPRICELABEL_TAG;
 myPriceLabel.font=[UIFont systemFontOfSize:12.0];
 myPriceLabel.textColor=[UIColor redColor];
 //ADD THE LABEL TO CELLS CONTACT VIEW
 [cell.contentView addSubview:myPriceLabel];

 //CONFIGURE THE saveprice LABEL
 savePriceLabel=[[[UILabel alloc]initWithFrame:CGRectMake(135, 32, 50, 32)]autorelease];
 savePriceLabel.tag=SAVEPRICELABEL_TAG;
 savePriceLabel.font=[UIFont systemFontOfSize:12.0];
 savePriceLabel.textColor=[UIColor redColor];
 //ADD THE LABEL TO CELLS CONTACT VIEW
 [cell.contentView addSubview:savePriceLabel];

 // Configure the product Image
 productImage = [[[UIImageView alloc]
 initWithFrame:CGRectMake(0.0, 0.0, 50.0, 60.0)]
 autorelease];
 productImage.tag = PRODUCTIMAGELABEL_TAG;
 // Add the Image to the cell’s content view
 [cell.contentView addSubview:productImage];
 //CONFIGURE THE VNAME LABEL
 vLabel=[[[UILabel alloc]initWithFrame:CGRectMake(60, 18, 50, 18)]autorelease];
 vLabel.tag=VLABEL_TAG;
 vLabel.font=[UIFont systemFontOfSize:12.0];
 //ADD THE LABEL TO CELLS CONTACT VIEW
 [cell.contentView addSubview:vLabel];
 //add button in table view cell...

    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(0,0,50,60);
    [button setTag:indexPath.row+1];
    //[button setImage:[UIImage imageNamed:@"m1.png"] forState:UIControlStateNormal];
    [button addTarget:self action:@selector(action:) forControlEvents:UIControlEventTouchUpInside];
    button.backgroundColor = [UIColor clearColor];
    [cell.contentView addSubview:button];


 }

 else {
 nameLabel=(UILabel*)[cell.contentView viewWithTag:NAMELABEL_TAG];
 valueLabel=(UILabel*)[cell.contentView viewWithTag:VALUELABEL_TAG];
 myPriceLabel=(UILabel*)[cell.contentView viewWithTag:MYPRICELABEL_TAG];
 savePriceLabel=(UILabel*)[cell.contentView viewWithTag:SAVEPRICELABEL_TAG];
 productImage = (UIImageView *)[cell.contentView viewWithTag:PRODUCTIMAGELABEL_TAG];
 vLabel=(UILabel*)[cell.contentView viewWithTag:VLABEL_TAG];
 yLabel=(UILabel*)[cell.contentView viewWithTag:YLABEL_TAG];
 sLabel=(UILabel*)[cell.contentView viewWithTag:SLABEL_TAG];
 }


 // Configure the cell...
 //mohit code start

 Product *pro = [self.products objectAtIndex:[indexPath row]];
 nameLabel.text = pro.name;
 valueLabel.text=[[NSNumber numberWithDouble:pro.value]stringValue];
 myPriceLabel.text=[[NSNumber numberWithDouble:pro.price]stringValue];
 savePriceLabel.text=[[NSNumber numberWithDouble:(pro.value-pro.price)]stringValue];
 vLabel.text=@"value Rs:";
 yLabel.text=@"your Price Rs:";
 sLabel.text=@"you Save Rs:";
 NSString *filePath = [[NSBundle mainBundle] pathForResource:pro.image
 ofType:@"png"];
 UIImage *image = [UIImage imageWithContentsOfFile:filePath];
 productImage.image = image;
 //cell.detailTextLabel.text=pro.value;
 /* 
 NSString *filepath=[[NSBundle mainBundle]pathForResource:pro.image ofType:@"png"];
 UIImage *image=[UIImage imageWithContentsOfFile:filepath];
 cell.imageView.image=image;
 */ 
//mohit code finish

return cell;
}

Ответы [ 4 ]

1 голос
/ 05 декабря 2011

Я бы согласился с тем, что создание ячейки в кончике - это путь, но если вы настаиваете на создании tableViewCells программно, вот мои предложения по ускорению: ваши элементы vLabel, yLabel и sLabel выглядят статичнымии, следовательно, его нужно устанавливать только при первом создании ячейки (внутри раздела 'if (cell == nil)').

Кроме того, кажется, что ваш productImage просто служит фоном для вашей пользовательской кнопки, потому что их рамки перекрываются.Я бы установил фоновое изображение пользовательской кнопки, чтобы получить тот же эффект.Кроме того, цена и стоимость продукта конвертируются в NSNumber каждый раз, когда ячейка должна отображаться, возможно, если вы сохранили их как NSNumbers в своем классе Product, это может помочь ускорить процесс.Наконец, похоже, что вы каждый раз вычисляете savePriceLabel из стоимости продукта и цены.Если эти значения вряд ли изменятся, может быть выгодно рассчитать savePrice один раз при первом создании Продукта.

Надеюсь, эти предложения помогут.

Кроме того, похоже, что вы настраиваететег вашей кнопки для indexPath при первом создании ячейки, но при повторном использовании тег никогда не обновляется.Это сделало бы значение тега неточным, если вы используете его, чтобы отслеживать, какая кнопка ячейки была нажата.

1 голос
/ 05 декабря 2011
  1. , если vLabel / yLabel / sLabel являются константами, назначьте их во время создания ячейки.
  2. преобразовать double в строку с помощью [NSString stringWithFormat:@"%.2f", double]
  3. , если изображения были в вашем комплекте, попробуйте [UIImage imageNamed:@"path/to/your/image"], он получит системный кэш изображений, чтобы уменьшить задержку загрузки изображений.
1 голос
/ 05 декабря 2011

Я бы искал интенсивную работу процессора, происходящую в другом месте вашего кода, так как многое из того, что у вас есть, выглядит прямо вперед.Посмотрите в других классах, чтобы увидеть, выполняете ли вы дорогую работу в основном потоке, поскольку это наиболее вероятный источник медленной прокрутки.Возможно, у вас загружен другой вид?В основном потоке есть какие-то сетевые запросы или запросы к базе данных?

1 голос
/ 05 декабря 2011

Вы можете попробовать сделать один кончик для просмотра контента и настроить макет ячейки таким образом. Затем вы просто создаете вид и назначаете значения. Некоторые из ваших совпадений должны быть просто потому, что кадры, которые вы создали для подпредставлений, отключены. (с помощью пера вы можете видеть это и перетаскивать вещи вокруг). Но я не уверен, что перо поможет производительности. Это просто личное предпочтение использовать перья, когда я могу.

Что касается скорости, вы не делаете ничего, что выглядит слишком интенсивно использующим процессор. На каком устройстве это работает или симулятор работает медленно? Насколько велико изображение, которое вы загружаете? Похоже, вы правильно используете повторно используемую ячейку, но вы подключились к отладчику и проверили, чтобы убедиться, что он не пытается воссоздать каждую ячейку каждый раз? Если это так, это может быть возможным источником или проблемами с производительностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...