ios objective-c uicollectionviewcell

ios - UIImageView en UICollectionViewCell personalizado devolviendo cero todo el tiempo



objective-c (5)

OK en mi guión gráfico he hecho un UICollectionView con 3 celdas. Una de las celdas para las que hice una clase personalizada obviamente extiende el UICollectionViewCell:

Y registré la clase en mi ViewDiDApear:

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

También he agregado una imageView a esa celda específica y una salida para esa imageView en mi clase personalizada. El problema se produce cuando hago que mi celda personalizada olvide todo lo que se configuró en mi guión gráfico, también conocido como el color de fondo, dónde está la vista de mi imagen, etc. Debido a esto mi imageView devuelve cero todo el tiempo.

-(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; } }


Bueno, esto es extraño. Conozco una solución, pero no entiendo muy bien por qué hace una diferencia. Tuve la misma configuración exacta y el mismo problema. El IBOutlet se estaba configurando en cero para el UIImageView, pero no para los UILabels.

Cambie su declaración para que UIImageView sea una propiedad segura en lugar de una variable de instancia.

@property (strong) IBOutlet UIImageView* imageView;

Esto solucionó el problema para mí. Claramente, hay algo en la forma en que UIImageView está conectado / instanciado desde el guión gráfico. Como un factor ''extraño'' añadido, uso la misma configuración de ivars con un UITableViewCell y no tengo ningún problema, solo en UICollectionViewCell


Debe registrar la nib la celda personalizada si está utilizando una como esta:

Así será:

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

en lugar de:

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


Probablemente haya resuelto este problema durante mucho tiempo.

Sin embargo para aquellos que encuentran esto y tienen el mismo problema.

es la llamada registerClass en su viewDidAppear

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

Ya está registrando la clase en Interface Builder, por lo que la llamada a registerClass:forCellWithReuseIdentifier: está reemplazando la entrada creada por IB.

Eliminar esta línea solucionará el problema.


También puedes ver este

Así que ahora, cuando declara Custom CollectionView Cell en su Guión gráfico, debe especificar el atributo denominado "Identificador" en la Vista reutilizable de la colección para algunas cadenas. Ahora esto puede sonar raro, pero, compruebe si el nombre del identificador no es el mismo que el nombre de clase de la celda de vista de colección. El nombre de clase / archivo de la celda y el identificador de celda debe ser diferente.

Eso realmente funcionó para mí, por lo tanto publicar.


Tuve el problema similar y se resolvió agregando el siguiente código en DeviceImageCell

- (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { _imageview = [[UIImageView alloc] initWithFrame:self.contentView.bounds]; [self.contentView addSubview:_imageview]; } return self; }

Desafortunadamente, no he podido obtener _imageview inicializado sin esta adición de código.