2012-09-29 66 views
29

Estoy tratando de usar UICollectionViewCell, ya que todo lo que quiero mostrar es una imagen. Puedo agregar la imagen a la celda usando UIColor colorWithImage: en la propiedad UICollectionViewCellcontentView.UICollectionView cellForItemAtIndexPath no registrando celda

En mi método loadView, estoy registrando la celda de la siguiente manera: [self.collectionView registerClass:[ImageCell class] forCellWithReuseIdentifier:@"MyCell"];

continuación es mi cellForItemAtIndexPath método:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MyCell" forIndexPath:indexPath]; 
    // cell customization 
    return cell; 
} 

Cuando lo ejecuto, tan pronto como llega a la línea de retirada de cola, se bloquea con el siguiente error:

*** Assertion failure in -[UICollectionView _dequeueReusableViewOfKind:withIdentifier:forIndexPath:] 

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'could not dequeue a view of kind: UICollectionElementKindCell with identifier MyCell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard' 

Me cansé de configurar una celda personalizada, y la utilicé t como la clase y obtuve el mismo error. Mi celda personalizada subcultivada UICollectionViewCell y no tenía nada implementado, a excepción de la predeterminada initWithFrame. Eso es porque solo quería cambiar el color de fondo de la vista. No estoy seguro de cuál es el problema, pero ¿podría alguien echar un vistazo a mi código y ayudarme? He estado tratando de resolver esto por un buen tiempo sin absolutamente nada de suerte.

Respuesta

60

Si solo desea mostrar una imagen, no necesita hacer ninguna subclasificación, puede establecer la celda backgroundColor con colorWithPatternImage:. Registrar la clase de esta manera:

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

luego usarlo de esta manera:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath]; 
    cell.backgroundColor = [UIColor colorWithPatternImage:[self.results objectAtIndex:indexPath.row]]; 
    return cell; 
} 

En este ejemplo, los resultados es una array de UIImages.

8

Pruebe a establecer un punto de interrupción en

[self.collectionView registerClass:[ImageCell class] forCellWithReuseIdentifier:@"MyCell"]; 

Conjeturaría su loadView (Quiso decir viewDidLoad?) No está siendo llamado método, por lo que la clase no está registrada en el CollectionView.

6

si su vista de colección está conectado el guión gráfico y el delegado y el origen de datos se establece allí, y le proporcionan los métodos necesarios para la fuente de datos y delegado, a continuación, añadir la llamada registro hace que el retorno

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

un UICollectionView en lugar de tu propia subclase. Así que haga cualquiera pero no ambos.

+1

¡Gracias por esto! Me estaba volviendo loco :) –

+0

Si quiere usar Xib, puede encontrar la respuesta en este documento [UICollectionView agregando UICollectionCell] (http://stackoverflow.com/questions/15184968/uicollectionview-adding-uicollectioncell). – Autobots

4

Indica tu nombre de identificador de celda como en el código de

enter image description here

+0

Sí, esto junto con registrar la vista de colección en viewDidLoad hizo el truco. Me las arreglé para causarme un poco de dolor en la llamada dequeque por un tiempo. Tenía "Célula", es decir, con un espacio en blanco extraño, que por supuesto no es lo mismo que "Célula", así que ten mucho cuidado con tus nombres. – TJA

12

Si está utilizando xib en applivation a continuación, añadir siguiente en su método viewDidLoad

[self.myCollectionView registerNib:[UINib nibWithNibName:@"CollectionViewCell" bundle:nil] forCellWithReuseIdentifier:@"CellIdentifier"]; 

de lo contrario si el uso del guión gráfico agregar siguiente

[self.myCollectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"CellIdentifier"]; 

Finalmente a dd esto (si no)

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CellIdentifier" forIndexPath:indexPath]; 
return cell; 
} 

Hope above will help.

+2

Gracias, me recuerda registrar "Nib", ¡buena suerte! – Resty

+0

Muchas gracias. Tu primer fragmento fue lo que estaba buscando :) – Mexx

+0

Estoy usando storyboard y mt ¿Célula personalizada no tiene ninguna idea? –

Cuestiones relacionadas