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;
}
}
Ответы
Ответ 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, инициализированный без добавления этого кода.