web-dev-qa-db-fra.com

échec d'assertion iOS dans UICollectionView

Je reçois l'erreur ...

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

Lors de la tentative d'affichage d'un UICollectionView.

Les lignes qui le provoquent sont ...

static NSString *CellIdentifier = @"Cell";

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

Erreur lors de la sortie de la file d'attente.

Il n’ya pas d’autres erreurs et j’ai du mal à savoir par où commencer.

Quelqu'un peut-il faire la lumière sur cette question?

27
Fogmeister

Vous avez lu la documentation (vous auriez peut-être dû le faire en premier :))

Quoi qu'il en soit, la collectionViewView que j'utilise se trouve dans un fichier xib séparé (pas un storyboard) et à partir de la documentation ...

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

Merci

29
Fogmeister

Vous devez vous inscrire comme ci-dessous:

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

Assurez-vous que si vous utilisez la méthode registerNib::

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

queAUSSIdans le fichier nib, lorsque vous sélectionnez la vue réutilisable de la collection de niveau supérieur, utilisez l'inspecteur d'attributs et assurez-vous que la Identifier est définie sur la même valeur que vous transmettez à withReuseIdentifier: paramètre.

3
bshirley

J'ai eu le même problème. Voici comment je l'ai résolu.

Bouge toi

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

être en - (void)viewDidLoad

plutôt que la méthode - (void)awakeFromNib.

2
U.Jhon

Remplacer

NSString *CellIdentifier = @"Cell";

avec

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

J'ai vu cette erreur apparaître lors de l'utilisation de plusieurs UICollectionViews avec des identificateurs uniques de réutilisation. Dans ViewDidLoad, vous souhaitez enregistrer chaque identifiant reuseIdentifier de CollectionView de la manière suivante:

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

Ensuite, lorsque vous accédez à "- (UICollectionViewCell *) collectionView: (UICollectionView *) collectionView cellForItemAtIndexPath: (NSIndexPath *) indexPath", vous voulez vous assurer que vous n'essayez pas de définir une cellule pour collectionView1 sur reuseIdentifier pour collectionView2 ou vous. va avoir cette erreur.

NE PAS FAIRE CECI : (ou collectionView2 verra le mauvais identifiant et jettera un ajustement avant de voir l'identifiant qu'il attendait)

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

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

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

FAIRE CECI :

UICollectionViewCell *cell;

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

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

Je n'ai que crash sur iOS 9 uniquement (iOS 10/11 fonctionnent correctement).

Je n'avais pas de sous-classe personnalisée d'une disposition de flux mais je définissais la variable headerReferenceSize directement sur celle existante . Donc, dans Interface Builder avec En-tête de section activé, j'ai obtenu ce blocage, sans la coche, tout fonctionne correctement et les en-têtes sont affichés correctement, puisque j'ai défini la taille en code. 

 enter image description here

0
fl034