web-dev-qa-db-fra.com

Erreur impossible de retirer de la file d'attente une vue de type UICollectionElementKindCell

Prenant d'abord le plongeon avec des vues de collection et je cours dans cette erreur:

Arrêt de l'application en raison d'une exception non interceptée 'NSInternalInconsistencyException', raison: 'ne peut pas retirer de la file d'attente une vue de type: UICollectionElementKindCell avec l'identificateur Cell - doit enregistrer un nib ou une classe pour l'identifiant ou connecter un prototype à un storyboard'

Le code est très simple, comme indiqué ci-dessous. Je ne peux pas pendant toute ma vie comprendre ce qui me manque. 

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

Le contrôleur de vue de collection a été créé à l'aide d'un nib et les délégués et sources de données sont tous deux définis sur le propriétaire du fichier. 

Le fichier d'en-tête de View Controller est également très basique. 

@interface NewMobialViewController_3 : UICollectionViewController <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>
@end
24
Anti-Dentite

Dans la documentation UICollectionView pour la méthode de sortie de file:

Important: Vous devez enregistrer un fichier de classe ou nib à l'aide de la méthode registerClass: forCellWithReuseIdentifier: ou registerNib: forCellWithReuseIdentifier: avant de l'appeler.

32
jrturton

Vous devez utiliser le même identifiant entre l'argument dequeueReusableCellWithReuseIdentifier et la propriété de UICollectionViewCell.

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

identifier

24
Kohei Mikami

Complétez ce que @jrtuton a écrit ... Ce dont vous avez besoin, c'est:

1) Enregistrez votre fichier nib pour le "connecter" avec votre identifiant:

//MyCollectionView.m
- (void) awakeFromNib{
 [self registerNib:[UINib nibWithNibName:@"NibFileName" bundle:nil]   forCellWithReuseIdentifier: @"MyCellIdentifier"];
}

2) Utilisez votre identifiant pour charger votre cellule personnalisée à partir d’une plume:

//MyCollectionView.m
- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath  *)indexPath {
    MyCustomCollectionViewCell* cell = [cv dequeueReusableCellWithReuseIdentifier:@"MyCellIdentifier" forIndexPath:indexPath];
}

3) Utilisez toujours NSString * statique pour éviter les mêmes identifiants dans votre application.

6
orafaelreis

j'ai tout fait correctement à 100% ... mais pour une raison quelconque, j'ai eu la même erreur pendant une heure, alors ce que j'ai fait est:

  1. aller au storyboard
  2. sélectionnez la cellule prototype (dans mon cas)
  3. effacez le nom de classe de l'inspecteur d'identité, puis réécrivez-le
  4. réécrire le nom de l'identifiant dans l'inspecteur d'attributs

tout simplement, cette étape a été refaite même si j’ai déjà corrigé cette erreur, son xcode similaire manque quelque chose à une nanoseconde spécifique!

2
Omar N Shamali

Swift4.0

Chaque fois que votre UITableViewCell est xib à ce moment-là, vous devez vous inscrire auprès de UITableView.

override func viewDidLoad(){
    super.viewDidLoad()

    self.yourtableview.register(UINib(nibName: "yourCellXIBname", bundle: Bundle.main), forCellReuseIdentifier: "YourCellReUseIdentifier")
   }
1
Rakesh Patel

Je sais que c’est un vieux problème, mais j’ai eu le même problème et je voulais partager ce qui m’avait réglé le problème. 

Dans mon cas, j'ai déclaré un identifiant global

let identifier = "CollectionViewCell"

et devait utiliserselfjuste avant de l'utiliser:

collectionView.dequeueReusableCellWithReuseIdentifier(self.identifier, forIndexPath: indexPath) as! CollectionViewCell

J'espère que ça aide quelqu'un :)

1
Jacob.B

Vous devez donner le bon identifiant réutilisable dans le storyboard, que vous avez donné dans le code lors de l'enregistrement de collectionViewCell.

Voici le code. 

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ClctnVC", for: indexPath)as! ClctnVC
    return cell            
}
0
Ayush Dixit

Si vous utilisez storyboard au lieu de xib, voici quelques étapes.

  1. Assurez-vous de remplir le bon identifiant de votre cellule.

 Prototype cell  Attribute panel

  1. Dans le ColletionViewDelegate.

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "YourCellName", for: indexPath)as! YourCellName
        return cell            
    }
    
  2. C'est tout. Vous aussi ne pas voulez ajouter registerClass: forCellWithReuseIdentifier:, ce qui provoquera une erreur élément nul.

0
Allen Wang

Ce qui a réglé le problème pour moi était (à peu près) identique à la réponse d'Omar, sauf que j'ai fini par créer une nouvelle classe personnalisée UICollectionViewCell et donner à l'indicateur de réutilisation de cellule un nom nouveau/différent de celui que j'avais utilisé ailleurs dans l'application. Cela a fonctionné immédiatement après cela.

0
ciara staggs