Изображение ячейки в UITableView не отображается до тех пор, пока не будет выбран
Изображение загружается, но оно не отображается в ячейке, пока я не коснусь (выберите) эту ячейку. Вот мой код, который устанавливает изображение в ячейке:
//Start loading the image using the image path
NSString *path = [occasion imagePath];
if (path != nil && [path hasPrefix:@"ass"])
{
NSLog(@"photo loaded from assets library");
//testing ALAssestLibrary
ALAssetsLibrary* assetsLibrary = [[ALAssetsLibrary alloc] init];
ALAssetsLibraryAssetForURLResultBlock resultsBlock = ^(ALAsset *asset)
{
ALAssetRepresentation *representation = [asset defaultRepresentation];
CGImageRef imageRef = [representation fullResolutionImage];
UIImage *image = [[UIImage alloc] initWithCGImage:imageRef];
[[cell imageView] setImage:[image imageByScalingAndCroppingForSize:CGSizeMake(36.0, 42.0)]];
[image release];
};
ALAssetsLibraryAccessFailureBlock failureBlock = ^(NSError *error){
NSLog(@"FAILED! due to error in domain %@ with error code %d", error.domain, error.code);
// This sample will abort since a shipping product MUST do something besides logging a
// message. A real app needs to inform the user appropriately.
abort();
};
//Convert path to an NSUrl
NSURL *url = [NSURL URLWithString:path];
// Get the asset for the asset URL to create a screen image.
[assetsLibrary assetForURL:url resultBlock:resultsBlock failureBlock:failureBlock];
// Release the assets library now that we are done with it.
[assetsLibrary release];
}
Вышеприведенный код является частью:
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
Любые идеи?
Ответы
Ответ 1
Я думаю, что в этом случае вы используете iOS, определенный UITableViewCell (а не пользовательский), который является одной из тех ячеек, которые вы получаете от "initWithStyle: reuseIdentifier:". Теперь эти ячейки внутренне построены таким образом, что, если вы не назначаете некоторый контент сразу, соответствующее подчинение не будет добавлено в иерархию содержимого cellView. Такое поведение типично для сложных пользовательских представлений, где окончательная компоновка ячеек может быть определена только в том случае, если все ее дочерние объекты полностью конкретизированы. (Например, у вас есть две метки, допустим, этикетка A и метка B, ярлык A - многострочный, и вы хотите добавить ярлык-B сразу под меткой-A, тогда вы можете поместить метку-B правильно только после того, как у вас есть контент label-A и вы вычисляете его высоту.). Поэтому я полагаю, что встроенные ячейки таблицы iOS выполняются одинаково, а иерархия subviews построена на этапе "layoutSubviews".
В вашем случае вы создаете ячейку, но откладываете время предоставления изображения. Но в этот момент layoutSubviews еще называется, и без какого-либо изображения соответствующий imageView даже не выделяется и не добавляется в иерархию contentView!
Итак, по моему мнению, решение для вас - просто сразу же назначить "заполнителя" для вашего актива (местозаполнитель может быть прозрачным образом, конечно), что гарантирует вам внутреннее создание UIImageView. Будьте осторожны с размером изображения, он должен быть близок к ожидаемому размеру изображения по той же причине, о которой говорилось выше. Как только ваш финишный блок называется, изображение должно быть уже там, и изображение появится.
Причина, по которой при нажатии на ячейку появляется изображение, связано с тем, что эта операция снова вызывает layoutSubviews. В этом случае весь код, вероятно, повторно выполняется и, как вы уже назовете "setImage:", перед этим устанавливается внутреннее свойство "image", и иерархия contentView будет перестроена с новым изображением.
Другим возможным решением вашей проблемы является, конечно, использование "настраиваемого" UITableViewCell (например, загруженного из Nib). В этом случае все ваши подзапросы будут загружены, и вы просто получите доступ к UIImageView с помощью своего тега (прочитайте документы в формате apple, чтобы узнать больше об этом полезном методе для создания ячеек табличного представления из файла Nib).
Ответ 2
вам нужно установить ячейку ячейки после установки изображения
как
[ячейка setNeedsLayout];
Ответ 3
Я долго царапал себе голову и, наконец, понял это.
Моя ошибка заключалась в том, что я устанавливал изображение в cell.imageView
, когда мне нужно было установить фактический выход cell.eventImageView
. Это возилось с общим представлением изображений, представленным в UITableViewCell
. Надеюсь, это поможет кому-то.
Ответ 4
Это мой способ, как я решил эту проблему, я знаю, что это не самое лучшее, но эта работа:)
UIImage *thumbnailImage = ...
dispatch_async(dispatch_get_main_queue(), ^{
[cell.imageView setImage:thumbnailImage];
UITableViewCellSelectionStyle selectionStyle = cell.selectionStyle;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
[cell setSelected:YES];
[cell setSelected:NO];
cell.selectionStyle = selectionStyle;
});
Ответ 5
В моем случае я настраивал ячейку прототипа через Storyboard, но случайно использовал метод dequeueCellWithIdentifier:forIndexPath
вместо dequeueCellWithIdentifier:
.
Первый метод должен использоваться только при сопоставлении ячеек с табличным просмотром через программные методы UITableView registerClass:forReuseIdentifier:
или registerNib:forReuseIdentifier
.
Ответ 6
У меня была аналогичная проблема. Я зарегистрировал класс UITableViewCell по умолчанию вместо моего пользовательского класса.
У меня было это:
tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: visibilityCellIdentifier)
но я должен был это сделать:
tableView.registerClass(VisibilityCell.self, forCellReuseIdentifier: visibilityCellIdentifier)
Создание ячейки все выглядело работоспособным, когда я прошел через отладчик, но ничего не появилось, пока я не выбрал каждую строку.
Ответ 7
Иногда это происходит, когда вы используете пользовательский UITableViewCell
с ярлыками, изображениями и т.д., но также и где-то вы устанавливаете UILabel по умолчанию для ячейки. например
customCell.textLabel.text = @"some text"
Чтобы решить эту проблему, не используйте метку по умолчанию, вместо этого добавьте свой собственный UILabel в свою пользовательскую ячейку.
Ответ 8
У меня такая же проблема, когда я использую этот код:
cell = [tableView dequeueReusableCellWithIdentifier:kCellSection1 forIndexPath:indexPath];
if (indexPath.row == 0) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellSection1];
cell.textLabel.text = @"Vote Up for me if it help for you!";
}
Но я исправлю это, заменив:
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellSection1];
To:
cell = [cell initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellSection1];