Ячейка UITableView иногда не может обновить изображение, но отображается нормально после прокрутки - PullRequest
3 голосов
/ 01 апреля 2012

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

Вкратце: приложение пытается получить изображение для текущей ячейки из своего локального кэша. Если это не удается, он запускает фоновый поток для загрузки изображения, а затем обновляет пользовательский интерфейс из основного потока. Это работает в 90% случаев. Если этого не происходит, imageView в ячейке остается пустым. Интересно, что это всегда происходит с одними и теми же изображениями.

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

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

Я также пытался обновить ячейку с setNeedsDisplay, но это тоже не работает. То, что работает, но портит мою анимацию, в дополнение к тому, что она немного жесткая, это [tableView reloadData].

// tableView:cellForRowAtIndexPath: 
if(!pic) {
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // download image, add it to the cache etc.
    dispatch_async(dispatch_get_main_queue(), ^{
        // check if cell is visible
        if ([[tableView visibleCells] containsObject: theCell]) {
          [[theCell imageView] setImage:pict];
          [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:idxp] withRowAnimation:UITableViewRowAnimationAutomatic];
        }
     });
  });
}

Ответы [ 4 ]

1 голос
/ 03 июня 2015

У меня та же проблема. Это из-за этого я обновляю изображение напрямую. Например, [cell.image setImage:imageName]; Но я подумал, что правильный путь заключается в том, что вам нужно иметь массив изображений, обновить массив изображений. Затем вызовите функцию reloaddata UITableView.

1 голос
/ 25 сентября 2012

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

РЕДАКТИРОВАТЬ: Просто перечитайте вопрос и увидите, что оригинальный постер уже попробовал setNeedsDisplay, так что это, вероятно, не поможет в этом случае.Я оставлю этот ответ для всех, кто наткнется на это, хотя

Передача imageView ячейки для ретрансляции сделала свое дело:

- (void)imageDidDownload:(UIImage *)image // Note: custom delegate callback
{
    [self.imageView setImage:image];
    [self.imageView setNeedsLayout];
}
0 голосов
/ 10 апреля 2012

Да, проблема была на моей стороне.

Точной причиной был какой-то довольно странный код сравнения дат. Точнее, этот код не вызывал reloadRowsAtIndexPaths: с правильными индексами, потому что две ячейки имели одинаковые даты, в результате чего одна ячейка обновлялась дважды, а одна ячейка вообще не обновлялась. Я не имею в виду код, указанный в вопросе.

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

0 голосов
/ 01 апреля 2012

Я также видел, что setImage в представлении изображения не будет обновляться должным образом, решение, которое я и другие использую, заключается в назначении самого UIImageView.

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