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

UIImageView в пользовательском UICollectionViewCell постоянно возвращает nil

ОК в моей доске объявлений Я сделал UICollectionView с 3 ячейками. Одна из ячеек я создал пользовательский класс, который явно расширяет UICollectionViewCell:

enter image description here

И я зарегистрировал класс в моем ViewDiDApear:

[self.collectionView registerClass:[DeviceImageCell class] forCellWithReuseIdentifier:@"Cell1"];

Также я добавил изображение в эту конкретную ячейку и выход для этого образа в моем пользовательском классе. Проблема возникает, когда я создаю свою собственную ячейку, она забывает все, что было установлено в моей раскадровке, а также цвет фона, где мой образ изображения и так далее. Из-за этого мой ImageView возвращает ноль все время.

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {

    if(indexPath.row == 0)
    {
        static NSString *identifier = @"Cell1";
        DeviceImageCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
        UIImage *image = [UIImage imageNamed:@"dysart-woods-full.jpg"];
        cell.imageview.image = image;
        cell.backgroundColor = [UIColor blueColor];

        //cell.imageview.image = image;
        return cell;
    }
    else if(indexPath.row == 1)
    {
        static NSString *identifier = @"Cell2";
        UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
        return cell;
    }
    else
    {
        static NSString *identifier = @"Cell3";
        UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
        UIImageView *imageView = (UIImageView *)[cell viewWithTag:1];
        imageView.image = [UIImage imageNamed:@"dysart-woods-full.jpg"];

        return cell;
    }
}
4b9b3361

Ответ 1

Вероятно, вы давно решили эту проблему.

Однако для тех, кто находит это и имеет ту же проблему

это вызов registerClass в вашем viewDidAppear

[self.collectionView registerClass:[DeviceImageCell class] forCellWithReuseIdentifier:@"Cell1"];

Вы уже регистрируете класс в Interface Builder, поэтому вызов registerClass:forCellWithReuseIdentifier: заменяет запись, созданную IB.

Удаление этой строки устранит проблему.

Ответ 2

Вы должны зарегистрировать пользовательскую ячейку nib, если вы используете ее как-то:

Итак, это будет:

[self.collectionView registerNib:[UINib nibWithNibName:@"CustomCell" bundle:nil] forCellWithReuseIdentifier:@"CustomCellIdentifier"];

вместо:

[self.collectionView registerClass:[CustomCell class] forCellWithReuseIdentifier:@"CustomCellIdentifier"];

Ответ 3

Ну, это странно. Я знаю решение, но я не совсем понимаю, почему это имеет значение. У меня была такая же точная настройка и та же проблема. IBOutlet устанавливался на нуль для UIImageView, но не UILabels.

Измените объявление для UIImageView как сильное свойство вместо переменной экземпляра.

@property (strong) IBOutlet UIImageView* imageView;

Это решило проблему для меня. Очевидно, что есть что-то с тем, как UIImageView подключается/создается из раскадровки. В качестве добавленного "странного" фактора я использую ту же настройку ivars с UITableViewCell и не имею проблемы, только в UICollectionViewCell

Ответ 4

У меня была аналогичная проблема, и она была решена путем добавления следующего кода в DeviceImageCell

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {

        _imageview = [[UIImageView alloc] initWithFrame:self.contentView.bounds];
        [self.contentView addSubview:_imageview];
    }
    return self;
}

К сожалению, мне не удалось получить _imageview, инициализированный без добавления этого кода.