dequeueReusableCellWithIdentifier, вызывающий проблему в UIImageView - PullRequest
1 голос
/ 20 августа 2011

Я загружаю tableView с 500 строками. Проблема в том, что в каждом ряду есть разная картина. Или когда я использую dequeueReusableCellWithIdentifier, эти изображения просто загружаются снова, а реальные изображения, которые я ищу, не отображаются (у меня просто около 8 различных изображений: первые 8 загружены на мой экран). Если я не использую dequeureReusableCellIdentifier, загружаются все изображения. Но замедлит ли это отображение?

Вот код (я сейчас работаю над кэшированием картинки):

- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CustomCellIdentifier = @"CustomCellIdentifier";
    UITableViewCell *cell = [tableView
                             dequeueReusableCellWithIdentifier: CustomCellIdentifier];

    NSLog(@"Launching CellForRowAtIndexPath");
    if (cell == nil) {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell"
                                                     owner:self options:nil];
        if ([nib count] > 0) {
            cell = self.profilCell;
        } else {
            NSLog(@"failed to load CustomCell nib file!");
        }
    }
    NSUInteger row = [indexPath row];
    NSDictionary *rowData = [listProfils objectAtIndex:row];
    UILabel *nameLabel = (UILabel *)[cell viewWithTag:nameValueTag];
    nameLabel.text = [rowData objectForKey:@"name"];
    NSString *finalId = [NSString stringWithFormat:@"http://graph.facebook.com/%@/picture", [rowData objectForKey:@"id"]];
    UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:finalId]]];
    [profilPic setImage:image];
    return cell;
}

Спасибо! :)

Ответы [ 2 ]

1 голос
/ 20 августа 2011

Похоже, у вас есть ивар profilPic, который, вероятно, является выходом, который связывается при загрузке нового пера ячейки.Если это так, он всегда будет указывать на последнюю загруженную ячейку и не изменит изображение в ячейке, которую вы только что удалили.Вместо того, чтобы использовать розетку, вы можете захотеть идентифицировать этот пользовательский вид другим способом, например тегом.Итак, если вы установите для тега профиля UIImageView значение 100, например, в Интерфейсном Разработчике, вы можете сделать что-то вроде этого:

UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:finalId]]];
UIImageView* cellImageView = (UIImageView*)[cell viewWithTag:100];
[cellImageView setImage:image];

Кроме того, я просто хочу отметить, что -dataWithContentsOfURL: будет загружать URL-адрес синхронно в основном потоке.Если вы тестируете в симуляторе быстрое соединение, это будет работать очень хорошо.Однако, если вы находитесь в 3G в Сохо в пятницу днем ​​... ваше приложение, вероятно, начнет убиваться сторожем.

0 голосов
/ 16 июня 2012

Я только что столкнулся с этой проблемой, мое решение - сохранить приватное NSMutableDictionary для хранения новых изображений, которые ранее асинхронно загружались из Интернета, используйте мой идентификатор в качестве ключа, UIImageView в качестве объекта (потому что мне нужно загрузить изображение значкаво-первых), когда веб-изображение будет готово, измените его, когда tableView исключить возвращаемый ноль, я могу прочитать оригинал UIImage из моего собственного кэша.

Что-то вроде этого.1009 * Когда я загружаю фактическое изображение из Интернета, обновите кэш миниатюр.

asynchronously_load_image_from_web(^(UIImage *image) {
    cell.imageView.image = image;
    [thumbnailCache setObject:cell.imageView forKey:identifier];
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...