Обновите UITableViewCell, когда загрузка ленивого изображения будет завершена - PullRequest
3 голосов
/ 18 декабря 2009

У меня возникли проблемы с обновлением моих UITableViewCells после асинхронной загрузки изображения ячейки. Я использую пользовательские UITableViewCells, например, так:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"productCell";
    MainTableViewCell *cell = (MainTableViewCell *)[self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[[MainCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"productCell"] autorelease];
    }
}

У меня есть класс UITableViewCell, а затем класс, который выполняет все рисование. Это пример кода от Apple под названием «AdvancedTableViewCells», и я делаю композитный.

У меня есть изображения в моих ячейках, которые я загружаю асинхронно, используя образец кода Apple под названием «LazyTableImages». Вот делегат, который должен обновлять ячейку:

- (void)coverImageDidLoad:(NSIndexPath *)indexPath {
    CoverImageAsyncLoader *coverImageAsyncLoader = [imageDownloadsInProgress objectForKey:indexPath];
    if (coverImageAsyncLoader != nil) {
        MainTableViewCell *cell = (MainTableViewCell *)[self.tableView cellForRowAtIndexPath:coverImageAsyncLoader.indexPathInTableView];

        // Display the newly loaded image
  if (coverImageAsyncLoader.products.coverImage != nil) {
   cell.productCover = coverImageAsyncLoader.products.coverImage;
  } else {
   cell.productCover = blankCoverImage;
  }
    }
}

Но ничего не происходит. Друг сказал мне, что я не могу обновить пользовательский интерфейс из фонового потока, но так как я делаю это через делегата, я не уверен, почему он не обновляется. Я пробовал:

 [cell setNeedsDisplay];
 [cell.contentView setNeedsDisplay];

, а также установить ячейку как:

 cell = [[[MainCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"productCell"] autorelease];

и затем обновите отображение ячейки.

Но ничего не работает :( Я могу опубликовать больше кода, но сообщение уже немного длиннее.

1 Ответ

3 голосов
/ 18 декабря 2009

Если вам известны строка и раздел индекса пути к рассматриваемой ячейке (например, myCellIndexPath.section и myCellIndexPath.row), взгляните на перезагрузку ячейки UITableView с помощью метода -reloadRowsAtIndexPaths:withRowAnimation: представления таблицы.

Например:

[tableView beginUpdates];
NSUInteger _path[2] = {myCellIndexPath.section, myCellIndexPath.row};
NSIndexPath *_indexPath = [[NSIndexPath alloc] initWithIndexes:_path length:2];
NSArray *_indexPaths = [[NSArray alloc] initWithObjects:_indexPath, nil];
[_indexPath release];
[tableView reloadRowsAtIndexPaths:_indexPaths withRowAnimation:UITableViewRowAnimationRight];
[_indexPaths release];
[tableView endUpdates];

При обновлении пользовательского интерфейса вы захотите использовать этот метод в основном потоке.

Существуют другие анимации строк, в зависимости от вкуса (UITableViewRowAnimationFade, UITableViewRowAnimationNone и т. Д.). Найдите в справке структуру UITableViewRowAnimation.

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