UITableView медленный, даже с несколькими объектами? - PullRequest
1 голос
/ 15 февраля 2010
- (void)viewDidLoad {
    [super viewDidLoad];
    [self.tableView setRowHeight:100];
    [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
    [self.view setBackgroundColor:[UIColor groupTableViewBackgroundColor]];
}


#pragma mark -
#pragma mark Table view data source

// Customize the number of sections in the table view.
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}


// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 3;
}


// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectMake(0, 0, 320, 100) reuseIdentifier:CellIdentifier] autorelease];

        // For Name/Phone: 
        UITextField *name = [[[UITextField alloc] initWithFrame:CGRectMake(75, 22, 200, 25)] autorelease];
        [name setFont:[UIFont systemFontOfSize:14]];
        [name setPlaceholder:@"John Doe"];
        [name setReturnKeyType:UIReturnKeyDone];
        [name setAutocapitalizationType:UITextAutocapitalizationTypeWords];
        [name setAutocorrectionType:UITextAutocorrectionTypeNo];
        [name setContentVerticalAlignment:UIControlContentVerticalAlignmentCenter];

        UITextField *phone = [[[UITextField alloc] initWithFrame:CGRectMake(75, 67, 200, 25)] autorelease];
        [phone setFont:[UIFont systemFontOfSize:14]];
        [phone setPlaceholder:@"0412 123 123"];
        [phone setReturnKeyType:UIReturnKeyDone];
        //[phone setKeyboardType:UIKeyboardTypePhonePad];
        [phone setContentVerticalAlignment:UIControlContentVerticalAlignmentCenter];

        UIImageView *background = [[[UIImageView alloc] initWithFrame:CGRectMake(9, 11, 302, 89)] autorelease];
        background.image = [UIImage imageNamed:@"book-personaldetailsbg.png"];

        // Add to the View
        [cell addSubview:background];
        [cell addSubview:name];
        [cell addSubview:phone];

        // Add actions:
        [name addTarget:self action:@selector(textFieldDone:) forControlEvents:UIControlEventEditingDidEndOnExit]; 
        [phone addTarget:self action:@selector(textFieldDone:) forControlEvents:UIControlEventEditingDidEndOnExit]; 

    }

    return cell;
}

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

Ответы [ 4 ]

10 голосов
/ 15 февраля 2010

UITableViewCell со многими подпредставлениями медленно рендерится на iPhone из-за способа, которым телефон рендерит каждый слой.

Читать это: http://blog.atebits.com/2008/12/fast-scrolling-in-tweetie-with-uitableview/

Информация в этом посте по-прежнему чрезвычайно актуальна и полезна, но ссылка на загрузку примера проекта не работает (по состоянию на 8 декабря 2011 г.). Однако в собственной документации Apple по просмотру таблиц уже есть примеры плоских ячеек для быстрой прокрутки журнала. Проверьте это: http://developer.apple.com/library/ios/#samplecode/AdvancedTableViewCells/Introduction/Intro.html

Основные моменты:

  • iPhone не справляется с Альфой очень быстро
  • Для подпредставлений свойство opaque должно иметь значение YES
  • Если возможно, нарисуйте свои подпредставления в одном непрозрачном представлении для лучшей производительности.

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

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

0 голосов
/ 21 апреля 2014

Вот решение, ребята, Внутри блока добавьте изображения для загрузки и все:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
    dispatch_async(queue, ^{
        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:
                                                      [[feeds objectAtIndex:indexPath.row]
                                                       objectForKey: @"url"]]];
        UIImage *image = [UIImage imageWithData:data];
        dispatch_async(dispatch_get_main_queue(), ^{
            cell.imagen.image = image;
        });

Используйте Grand Central Dispatch для приоритета. Я могу объяснить, если кто-то хочет, просто напишите мне по адресу info@tonymedrano.com

0 голосов
/ 15 февраля 2010

Начните с удаления фона этой ячейки. Посмотрите, если это имеет значение.

0 голосов
/ 15 февраля 2010

Я думал, что вы не должны устанавливать высоту клетки, как вы. Я полагаю, что вы должны реализовать метод heightForCellAtIndexPath (может не иметь правильное имя на 100%), и он спросит вашего делегата, насколько высоким должен быть размер каждой отдельной ячейки. Я чувствую, что слышал о проблемах с производительностью, если не сделал «правильный» путь. ИМХО

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

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