ios - El error no pudo poner en cola una vista del tipo UICollectionElementKindCell
objective-c uicollectionview (10)
Tomando el primer paso con vistas de colección y estoy corriendo en este error:
La aplicación de terminación debido a la excepción no detectada ''NSInternalInconsistencyException'', motivo: ''no se pudo poner en cola una vista de tipo: UICollectionElementKindCell con identificador de celda: debe registrar una punta o una clase para el identificador o conectar una celda prototipo en un guión gráfico''
El código es muy simple, como se muestra a continuación. No puedo por mi vida averiguar qué es lo que me estoy perdiendo.
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
cell.backgroundColor = [UIColor whiteColor];
return cell;
}
El controlador de vista de colección se creó con una punta y los delegados y las fuentes de datos están configurados como propietario del archivo.
Ver el archivo del encabezado del Controlador también es muy básico.
@interface NewMobialViewController_3 : UICollectionViewController <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>
@end
Complementando lo que @jrtuton escribe ... Lo que necesita es:
1) Registre su archivo nib para "conectarlo" con su identificador:
//MyCollectionView.m
- (void) awakeFromNib{
[self registerNib:[UINib nibWithNibName:@"NibFileName" bundle:nil] forCellWithReuseIdentifier: @"MyCellIdentifier"];
}
2) Use su identificador para cargar su celda personalizada desde una punta:
//MyCollectionView.m
- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath {
MyCustomCollectionViewCell* cell = [cv dequeueReusableCellWithReuseIdentifier:@"MyCellIdentifier" forIndexPath:indexPath];
}
3) Utilice NSString * siempre estático para evitar los mismos identificadores nuevamente en su aplicación.
De la documentación de UICollectionView para el método de salida de cola:
Importante: debe registrar un archivo de clase o nib utilizando el método registerClass: forCellWithReuseIdentifier: o registerNib: forCellWithReuseIdentifier: antes de llamar a este método.
Debe proporcionar el identificador reutilizable correcto en el guión gráfico, que ha ingresado en el código al registrar el collectionViewCell.
Aquí está el código.
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ClctnVC", for: indexPath)as! ClctnVC
return cell
}
Debe usar el mismo identificador entre el argumento dequeueReusableCellWithReuseIdentifier y la propiedad UICollectionViewCell.
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CollectionViewCell" forIndexPath:indexPath];
Lo que solucionó esto para mí fue (aproximadamente) igual que la respuesta de Omar, excepto que terminé creando una nueva clase personalizada UICollectionViewCell y le di al identificador de reutilización de células un nombre nuevo / diferente al que había usado en otra parte de la aplicación. Trabajó inmediatamente después de eso.
Sé que esto es antiguo, pero he experimentado el mismo problema y quería compartir lo que me lo arregló.
En mi caso, he declarado un identificador global.
let identifier = "CollectionViewCell"
y tenía que usar el derecho propio antes de usarlo:
collectionView.dequeueReusableCellWithReuseIdentifier(self.identifier, forIndexPath: indexPath) as! CollectionViewCell
Espero que esto ayude a alguien :)
Si está utilizando el guión gráfico en lugar de xib, aquí hay algunos pasos.
- Asegurándose de llenar el identificador correcto de su celda.
En el ColletionViewDelegate.
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "YourCellName", for: indexPath)as! YourCellName return cell }
Eso es. Tampoco desea agregar registerClass: forCellWithReuseIdentifier: lo que provocará un error de elemento nulo.
Si lo crea por código, debe crear un UICollectionViewCell
personalizado. Luego, UICollectionView
un UICollectionView
, y use loadView
para establecer la vista, es el UICollectionView
que crea. Si creas en viewDidload()
, no funciona. Además, también puede arrastrar un UICollectionViewController
, ahorra mucho tiempo.
Tuve todo el 100% hecho correctamente. pero por alguna razón recibí el mismo error durante una hora, entonces lo que hice es:
- ir al guión gráfico
- Selecciona la célula prototipo (en mi caso).
- borre el nombre de la clase del inspector de identidad y, a continuación, vuelva a escribirlo
- reescriba el nombre del identificador en el inspector de atributos
simplemente, rediseñé este paso aunque lo haya corregido antes, ¡es como que xcode pierde algo en un nanosegundo específico!
Swift4.0
Siempre que su UITableViewCell
sea xib en ese momento, debe tener que registrarse en UITableView
.
override func viewDidLoad(){
super.viewDidLoad()
self.yourtableview.register(UINib(nibName: "yourCellXIBname", bundle: Bundle.main), forCellReuseIdentifier: "YourCellReUseIdentifier")
}