UICollectionViewCell selector no reconocido enviado a instancia

He creado una UICollectionViewCell que se parece a esto

#import "PhotoCell.h" @implementation PhotoCell @synthesize imageView; - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.backgroundColor = [UIColor clearColor]; imageView = [[UIImageView alloc] initWithFrame:(CGRect){.origin = CGPointMake(4.0f, 4.0f), .size=CGRectInset(frame, 4.0f, 4.0f).size}]; imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; [self.contentView addSubview:imageView]; } return self; } @end 

Estoy llamando a esto desde uno de mis controlleres de vista donde estoy tratando de configurar un UICollectionView … aquí es donde llamo a esta class

 - (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath; { PhotoCell *cell = (PhotoCell *)[self.photoCollectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath]; NSDictionary *currentPhotoDict = [imageArray objectAtIndex:indexPath.row]; UIImage *imageForCollection = [UIImage imageWithData:[currentPhotoDict objectForKey:@"DImage"]]; // but I have no idea where to pass the imag.... cell.imageView.image = imageForCollection; return cell; } 

El problema es que estoy recibiendo este error y luego mi aplicación cae en un montón.

  *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UICollectionViewCell imageView]: unrecognized selector sent to instance 0x16dc1a90' 

¡Cualquier ayuda para solucionar este problema sería muy apreciada!

ACTUALIZAR:

He creado un file .nib llamado aPhotoCell y he eliminado la UIView del mismo y agregué un UIImageView .. Luego he cambiado los objects Custom Class a PhotoCell y ahora que puedo ver el IBOutlet de UIImageView desde PhotoCell lo he enganchado … pero aún estoy recibiendo el mismo error … Espero que esto tenga sentido … de los comentarios y respuestas a continuación, esto es lo que pensé que tenía que hacer para arreglar … de cualquier manera seguiré buscando consejos y sugerencias respuestas

Un par de cosas..

En su class PhotoCell , declare una propiedad pública:

  @property (weak, nonatomic) IBOutlet UIImageView *imageView; 

Luego, en su PhotoCell xib (supongo que es aquí desde donde lo está creando), conéctelo al IBOutLet que creó.

Creo que está haciendo algo mal en su cellForItemAtIndexPath , ya que su error muestra una instancia de UICollectionViewCell no responde a cell.imageView.image = imageForCollection;

Asegúrate de que tu identificador de celda sea igual que lo pones en tu storyboard / file xib. Reescribe tu método cellForItemAtIndexPath así:

 - (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath;{ PhotoCell *cell = [ self.photoCollectionView dequeueReusableCellWithReuseIdentifier:@"CORRECT CELL IDENTIFIER HERE" forIndexPath:indexPath]; NSDictionary *currentPhotoDict = [imageArray objectAtIndex:indexPath.row]; UIImage *imageForCollection = [UIImage imageWithData:[currentPhotoDict objectForKey:@"DImage"]]; cell.imageView.image = imageForCollection; return cell; } 

Editar

Parece que creó una subclass de UICollectionViewCell y nunca creó un file xib para ello. Como no estás usando storyboards, haz esto:

En Xcode:

Cree un file nuevo: select " User Interface " de la izquierda debajo de " iOS' y select "empty" de la selección que le muestra.

Después de crear su file xib , vaya a él y elimine UIView que está allí. Luego, desde la biblioteca de objects a su derecha, busque UICollectionView Cell y arrástrela a la vista, luego arrastre un UIImageView y colóquelo en su UICollectionView cell.

Ahora select UICollectionViewCell que acaba de crear y establecer su class en la class PhotoCell . Conecta tus IBOutlets como arriba. Asegúrese de establecer también el atributo ' Reusable Cell '. Es importante aquí.

Luego, en el viewController que carga tu UICollectionView , agrega esto a viewDidLoad

  [photoCollectionView registerNib:[UINib nibWithNibName:@"THE XIB FILE NAME YOU JUST CREATED eg: PhotoCell" bundle:nil] forCellWithReuseIdentifier:@"REUSE IDENTIFIER HERE"]; 

Esto debería ayudarlo.

También tuve este problema y mi problema fue que tuve un error en mi código en otro lugar.

Utilicé este código para registrar el UICollectionViewCell en el método viewDidLoad.

 [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"reuseLabel"]; 

Sin embargo, cuando traté de actualizar la celda con mi UICollectionViewCell personalizado, no cambié esta línea para que funcione con mi celda personalizada. Entonces cambié el código a esto:

 [self.collectionView registerClass:[MyCustomCell class] forCellWithReuseIdentifier:@"reuseLabel"]; 
  1. Según UICollectionView Class Reference , CollectionViewCell simplemente no tenía la propiedad imageView . Debería agregarlo al contenido de la celda en Storyboard / en primer lugar.

  2. Además, está utilizando la propia class PhotoCell . Verifique que su celda tenga el nombre de class correcto en Storyboard.

Supongo que la celda identificada por "celda" se define en un file Xib. Si es así, sospecho que el error se debe a que la vista principal en el file Xib se define con la class UICollectionViewCell lugar de la class personalizada de PhotoCell .

EDITAR:
Después de saber que no está utilizando xib o storyboards, lo que ocurre es que dequeueReusableCellWithReuseIdentifier no encuentra ninguna celda con el identificador dado "cell" porque no la ha definido en ninguna parte. De la documentation:

Debe registrar un file de class o nib usando el método registerNib:forCellReuseIdentifier: o registerClass:forCellReuseIdentifier: antes de llamar a este método.

En su caso, debe usar registerClass:... para registrar su class con la "celda" o cualquier otro identificador.

El file PhotoCell xib necesita establecer "celda" en el Identificador. Su código debe ser:

 - (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath; { PhotoCell *cell = (PhotoCell *)[self.photoCollectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath]; if (cell == nil) { // Load the top-level objects from the custom cell XIB. NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"cell" owner:self options:nil]; // Grab a pointer to the first object (presumbly the custom cell, as that's all the XIB should contain). cell = [topLevelObjects objectAtIndex:0]; } NSDictionary *currentPhotoDict = [imageArray objectAtIndex:indexPath.row]; UIImage *imageForCollection = [UIImage imageWithData:[currentPhotoDict objectForKey:@"DImage"]]; // but I have no idea where to pass the imag.... cell.imageView.image = imageForCollection; return cell; 

}