2013-04-11 7 views
0

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

static NSString *myIdentifier = @"myIdentifier"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:myIdentifier]; 
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:myIdentifier]; 


    backImage = [[UIImageView alloc] initWithFrame:CGRectMake(2, 4, 300, 62)]; 
    userDp = [[UIImageView alloc] initWithFrame:CGRectMake(11, 10, 50, 50)]; 
    name   = [[UILabel alloc] initWithFrame:CGRectMake(67, 12, 176, 20)]; 

    name.font   = [UIFont fontWithName:@"HelveticaLTStd-Bold" size:12]; 

CustomActivityViewer *imgIndicator = [[CustomActivityViewer alloc] initWithView:userDp]; 
[imgIndicator startAnimating]; 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^{ 
    UIImage *img = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@/%@", IMAGE_URL, player.imagePath]]]]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [imgIndicator stopAnimating]; 
     if (img != nil) 
      userDp.image = img; 

     [imgIndicator stopAnimating]; 
    }); 
}); 

[name setShadowColor:[UIColor blackColor]]; 
[name setShadowOffset:CGSizeMake(1, 1)]; 
name.textColor = [UIColor colorWithRed:1.0 green:0.824 blue:0 alpha:1.0]; 

cell.accessoryType = UITableViewCellAccessoryNone; 
[cell setSelectionStyle:UITableViewCellEditingStyleNone]; 
cell.backgroundColor = [UIColor clearColor]; 

[cell.contentView addSubview:backImage]; 
[cell.contentView addSubview:userDp]; 
[cell.contentView addSubview:name]; 

return cell;  

}

если я место, если (ячейка! = Ноль), то клетки повторилась.

Что делать?

P.S В одном из собственных учебников iPhone я увидел что-то вроде cell.contentView, устанавливая элементы с тегами, а затем называя представления с тегами, если ячейка не равна нулю. Мне не удалось найти этот учебник. Просто сообщите, если кто-нибудь знает

+0

http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableView_Class/Reference/Reference.html в 'dequeueReusableCellWithIdentifier' причина, по которой он получает изображение с сервера снова, потому что он повторно использует ячейки в представлении таблицы, когда они исчезают, поэтому, когда они возвращаются, они снова загружаются, поэтому, когда вы запускаете свой код для ячейки, которая уже появилась, вы выполняете 'UIImage * img = [UIImage imageWithData: [NSData dataWithContentsOfURL: [NSURL URLWithString: [NSString stringWithFormat: @ "% @ /% @", IMAGE_URL, player.imagePath]]]] ', чтобы снова получить изображение. – Popeye

ответ

1

Если вы не хотите повторно загружать изображение каждый раз, вы просто кешируете свое изображение. Есть много вариант все вокруг, один из них NSCache или SDWebImage

+0

нет, это не то, что я хочу. Я хочу, чтобы мой tableCell прекратил перезагрузку –

+0

В iOS создание нового представления является экспансивным. Поэтому мы используем механизм reuseIdentifer, мы создаем небольшой набор ячеек. И когда новая ячейка становится видимой, мы заполняем ее данными. Поэтому вы должны использовать SDWebImage для загрузки изображения только один раз и подавать его на просмотр, когда это необходимо. –

+0

Действительно, это классная вещь, но это не мой вопрос. Я ищу свою ячейку tableView, чтобы прекратить перезагрузку, когда она невидима, и получить ее видимую. –

1

я не рекомендовать:

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

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

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

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

+0

+1 хорошо объяснил. – Popeye

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