UITableView запаздывает при прокрутке - PullRequest
1 голос
/ 15 февраля 2012

вот моя проблема: Мой UITableViewController отстает, когда я прокручиваю его. Он имеет около 60 пользовательских ячеек. Однако на симуляторе все работает без лагов. Вот мой код: CustomCell.m

#import "CustomCell.h"

@implementation CustomCell

@synthesize nameLabel,costLabel,giftPicture;

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code


        nameLabel = [[UILabel alloc]init];
        nameLabel.textAlignment = UITextAlignmentLeft;
        nameLabel.textColor = [UIColor colorWithRed:25/256.0 green:98/256.0       blue:52/256.0 alpha:1.0];
        costLabel = [[UILabel alloc]init];
        costLabel.textAlignment = UITextAlignmentLeft;


        giftPicture = [[UIImageView alloc]init];

        [self.contentView addSubview:nameLabel];
        [self.contentView addSubview:costLabel];
        [self.contentView addSubview:giftPicture];

        costLabel.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"background4"]];
        nameLabel.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"background4"]];
    }
    return self;
}
- (void)layoutSubviews {
    [super layoutSubviews];

    CGRect contentRect = self.contentView.bounds;
    CGFloat boundsX = contentRect.origin.x;
    CGRect frame;
    frame= CGRectMake(boundsX+10,10, 50, 50);
    giftPicture.frame = frame;

    frame= CGRectMake(boundsX+70 ,10, 350, 25);
    nameLabel.frame = frame;

    frame= CGRectMake(boundsX+70 ,40, 350, 18);
    costLabel.frame = frame;
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
}

@end

List.m

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [array1 count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[CustomCell alloc] initWithFrame:CGRectZero];
    }

    // Configure the cell...


    NSString *cellValue = [array1 objectAtIndex:indexPath.row];
    //cell.textLabel.text = cellValue; // загаловок клетки
    [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator]; // сделал чтобы клетка была со стрелочкой

    cell.nameLabel.text = cellValue;

    NSDictionary  *mainDictionary = [[NSDictionary alloc]init];
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSArray *languages = [defaults objectForKey:@"AppleLanguages"];
    NSString *currentLanguage = [languages objectAtIndex:0];
    if([currentLanguage isEqualToString:@"en"])
    {
        mainDictionary = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"animals" ofType:@"txt"]];
    }
    NSEnumerator *enumerator = [mainDictionary objectEnumerator];
    id returnValue;

    while ((returnValue = [enumerator nextObject]))
    {

        if([cell.nameLabel.text isEqualToString:[returnValue valueForKey:@"name"]] )
        {

            cell.animalPicture.image = [UIImage imageNamed:[returnValue valueForKey:@"icon"]];
            cell.costLabel.text = [NSString stringWithFormat:@"$%@ - $%@",[returnValue valueForKey:@"minAge"],[returnValue valueForKey:@"maxAge"]];

        }
    }
    return cell;

}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 75;
}
@end

Я пытался сделать пользовательские ячейки пустыми (удалить ярлыки и изображения), просто из-за любопытства, но это ничего не изменило. Не могли бы вы сказать мне, что я должен проверить, чтобы исправить эти лаги? Спасибо!

Ответы [ 3 ]

4 голосов
/ 15 февраля 2012

Вы выполняете большую инициализацию в методе -cellForRowAtIndexPath с UIImage s для каждой ячейки таблицы. Вероятно, вам следует сделать это только один раз и кэшировать изображения.

4 голосов
/ 15 февраля 2012

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

NSDictionary  *mainDictionary = [[NSDictionary alloc]init];

Просто для начала это а) кажется бессмысленным из-за этой следующей строки и б) похоже, что вы это просачиваете.

    mainDictionary = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"animals" ofType:@"txt"]];

Загрузка этого файла каждый раз не может быть звездной для производительности, вы должны приводить эти данные один раз, чтобы понравиться вашему контроллеру представления, а не каждый раз, когда вы заполняете ячейку.

NSEnumerator *enumerator = [mainDictionary objectEnumerator];
id returnValue;

while ((returnValue = [enumerator nextObject]))
{

    if([cell.nameLabel.text isEqualToString:[returnValue valueForKey:@"name"]] )
    {

Весь этот кусок, я бы переделал. Это должно быть тупым, используя NSDictionary неправильно. Словарь содержит ключ и значение, вам не нужно самостоятельно сканировать все это с помощью перечислителя, чтобы найти требуемое значение путем сравнения строк, вы должны использовать что-то вроде

[mainDictonary objectForKey:@"thingYouWant"];

выполнение того, что вы сказали, похоже на 60 полных перечислений словаря, и сравнение строк не может быть полезным для производительности таблицы и не является необходимым.

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

4 голосов
/ 15 февраля 2012

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

Скорейшая прокрутка, скорее всего, является результатом блокировки кода прокрутки при обработке изображений или другой сетевой активности.

Мое личное предпочтение при отладке этих ситуаций - начинать с пустого табличного представления.Это должно плавно прокручиваться даже с тысячами клеток.Затем добавьте содержимое tableView обратно по очереди и обратите внимание на то, когда прокрутка начинает отставать.

Пример кода Apple Lazy Table Images может помочь.

...