У меня возникли проблемы с обновлением моих 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];
и затем обновите отображение ячейки.
Но ничего не работает :( Я могу опубликовать больше кода, но сообщение уже немного длиннее.