2012-09-26 56 views
25

estoy recibiendo el error ...iOS aserción en UICollectionView

*** Assertion failure in -[UICollectionView _dequeueReusableViewOfKind:withIdentifier:forIndexPath:], /SourceCache/UIKit/UIKit-2372/UICollectionView.m:2249 

Al intentar mostrar un UICollectionView.

Las líneas que causan que son ...

static NSString *CellIdentifier = @"Cell"; 

UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath]; 

error ocurre en el quitar de la cola.

No hay otros errores, así que estoy luchando por saber por dónde empezar con esto.

¿Alguien puede arrojar luz sobre esto?

Respuesta

27

estado leyendo los documentos (posiblemente debería haber hecho esto primero :))

De todos modos, la CollectionView que estoy usando es dentro de un xib separada archivo (no un guión gráfico) y de los documentos ...

Important: You must register a class or nib file using the 
registerClass:forCellWithReuseIdentifier: or 
registerNib:forCellWithReuseIdentifier: method before calling this method. 

Gracias

+0

¿Cuándo llamas a este método? en la línea antes de "UICollectionViewCell * cell = [collectionView dequeue ..." o en un método diferente –

+1

Tuve que registrarlo en el método viewDidLoad. Solo necesita registrar el xib una vez para toda la colecciónView. Luego, cuando llamas dequeueCellWithIdentifier, va al xib que registraste. – Fogmeister

+2

Tuve el mismo problema, pero por alguna extraña razón, el compilador no reconoció el método 'registerClass' en' viewDidLoad', así que tuve que moverlo al método 'cellForItemAtIndexPath'. –

0

Reemplazar

NSString *CellIdentifier = @"Cell"; 

con

static NSString *CellIdentifier = @"Cell"; 
+0

Intenté eso primero. Acabo de leer los documentos. Necesito registrar una clase o punta antes de ejecutar dequeue ... – Fogmeister

36

Debe registrarse como a continuación:

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

Asegúrese de que si se utiliza el registerNib: método:

UINib *nibH = [UINib nibWithNibName:HEADER_ID bundle:nil]; 
[collectionView registerNib:nibH 
forSupplementaryViewOfKind:UICollectionElementKindSectionHeader 
     withReuseIdentifier:HEADER_ID]; 

que TAMBIÉN en el archivo de la semilla, cuando se seleccione la vista reutilizable de la colección de nivel superior, use el inspector de atributos y asegúrese de que el Identifier esté configurado para el mismo valor que está pasando al parámetro withReuseIdentifier:.

0

He visto este error cuando utilizo múltiples UICollectionViews con ReuseIdentifiers únicos. En viewDidLoad desea registrar reuseIdentifier de cada CollectionView así:

[_collectionView1 registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"collectionView1CellIdentifier"]; 
[_collectionView2 registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"collectionView2CellIdentifier"]; 

Entonces, cuando llegue a "- (UICollectionViewCell *) CollectionView: (UICollectionView *) CollectionView cellForItemAtIndexPath: (NSIndexPath *) indexPath" quiere asegurarse que no intente establecer una celda para collectionView1 en el reuseIdentifier para collectionView2 o obtendrá este error.

NO hagas esto: (O collectionView2 verá el identificador equivocado y lanzar un ataque antes de ver el identificador se esperaba)

UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"collectionView1CellIdentifier" forIndexPath:indexPath]; 

if(collectionView != _collectionView1){ 
    cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"collectionView2CellIdentifier" forIndexPath:indexPath]; 
} 

cell.backgroundColor = [UIColor greenColor]; 
return cell; 

hacer esto:

UICollectionViewCell *cell; 

if(collectionView == _collectionView1){ 
    cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"collectionView1CellIdentifier" forIndexPath:indexPath]; 
}else{ 
    cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"collectionView2CellIdentifier" forIndexPath:indexPath]; 
} 

cell.backgroundColor = [UIColor greenColor]; 
return cell; 
1

Tuve el mismo problema. Así es como lo resolví.

Mover

[self.pictureCollectionView registerNib:[UINib nibWithNibName: bundle:nil] forCellWithReuseIdentifier:reuseID]

estar en - (void)viewDidLoad,

en lugar de método - (void)awakeFromNib.

Cuestiones relacionadas