Подтвердить что ты не робот

Изображение ячейки в UITableView не отображается до тех пор, пока не будет выбран

  • Вот видео проблемы: http://youtu.be/Jid0PO2HgcU

  • У меня возникла проблема при попытке установить изображение для [cell imageView] в 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

Любые идеи?

4b9b3361

Ответ 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];