ячейка imageView в UITableView не появляется, пока не выбрано - PullRequest
28 голосов
/ 19 февраля 2012
  1. Вот видео проблемы: http://youtu.be/Jid0PO2HgcU

  2. У меня проблема при попытке установить изображение для [cell imageView] в UITableView изБиблиотека ресурсов.

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

//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

Есть идеи?

Ответы [ 8 ]

40 голосов
/ 20 февраля 2012

Я думаю, что в этом случае вы используете определенный в iOS UITableViewCell (а не пользовательский), это одна из тех ячеек, которые вы получаете из "initWithStyle: reuseIdentifier:". Теперь эти ячейки внутренне построены таким образом, что если вы не назначите некоторый контент немедленно, соответствующее подпредставление не будет добавлено в иерархию contentView ячейки. Этот тип поведения типичен для сложных пользовательских представлений, где окончательный макет ячейки может быть определен только тогда, когда все его подпредставления имеют полностью определенное содержимое. (Например, у вас есть две метки, скажем, метка A и метка B, метка A является многорядной, и вы хотите добавить метку-B непосредственно под меткой-A, тогда вы можете правильно разместить метку-B только после того, как у вас будет содержимое метки-A и вы вычисляете его высоту.) Поэтому я предполагаю, что встроенные ячейки таблицы iOS выполняются таким же образом, а иерархия подпредставлений строится на этапе layoutSubviews.

В вашем случае вы создаете ячейку, но откладываете время предоставления изображения. Но на этом этапе layoutSubviews еще не был вызван, и без какого-либо изображения соответствующий imageView даже не выделяется и не добавляется в иерархию contentView!

Так что, по моему мнению, решение для вас просто состоит в том, чтобы сразу назначить «заполнитель» для вашего актива (заполнитель может быть, конечно, прозрачным изображением), который гарантирует вам внутреннее создание UIImageView. Будьте осторожны с размером изображения, оно должно быть близко к ожидаемому размеру изображения по той же причине, что и описанная выше. Как только ваш финишный блок будет вызван, изображение должно быть уже там, и изображение появится.

Причина, по которой при нажатии на ячейку появляется изображение, связана с тем, что эта операция снова вызывает layoutSubviews. В этом случае весь код, вероятно, будет повторно выполнен, и, как вы уже называли «setImage:», до этого устанавливается внутреннее свойство «image», и иерархия contentView будет перестраиваться с новым изображением.

Другим возможным решением вашей проблемы, конечно, является использование «пользовательского» UITableViewCell (например, загруженного из Nib). В этом случае все ваши подпредставления будут загружены, и вы просто получите доступ к UIImageView, используя его тег (прочитайте документы Apple, чтобы узнать больше об этой полезной технике для создания ячеек табличного представления из файла Nib).

26 голосов
/ 16 июня 2015

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

, как и

[cell setNeedsLayout];

6 голосов
/ 05 декабря 2014

Я почесал голову так долго и наконец понял это.

Моя ошибка заключалась в том, что я устанавливал изображение в cell.imageView, когда я должен был установить свою фактическую розетку cell.eventImageView. Он возился с общим видом изображения, предоставленным в UITableViewCell. Надеюсь, это кому-нибудь поможет.

1 голос
/ 25 августа 2015

В моем случае я настраивал ячейку прототипа через раскадровку, но случайно использовал dequeueCellWithIdentifier:forIndexPath метод вместо dequeueCellWithIdentifier:.

Первый метод используется только при присвоении ячеек табличному виду с помощью программных методов UITableView registerClass:forReuseIdentifier: или registerNib:forReuseIdentifier.

1 голос
/ 30 декабря 2013

Это мой способ, как я решил эту проблему, я знаю, что это не самое лучшее, но это работает:)

    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;
    });
0 голосов
/ 05 июля 2016

При использовании этого кода я получаю ту же проблему:

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];

Кому:

cell = [cell initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellSection1];
0 голосов
/ 30 марта 2016

Иногда это происходит, когда вы используете пользовательский UITableViewCell с метками, изображениями и т. Д., Но также и там, где вы устанавливаете UILabel по умолчанию для ячейки. например

customCell.textLabel.text = @"some text"

Чтобы решить эту проблему, избегайте использования метки по умолчанию, вместо этого добавьте свою собственную UILabel в свою ячейку.

0 голосов
/ 28 января 2016

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

У меня было это:

tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: visibilityCellIdentifier)

, но я должен был иметь это:

tableView.registerClass(VisibilityCell.self, forCellReuseIdentifier: visibilityCellIdentifier)

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

...