J'essaie d'utiliser UICollectionViewCell
, car tout ce que je veux afficher est une image. Je peux ajouter l'image à la cellule en utilisant UIColor colorWithImage:
sur la propriété UICollectionViewCell
de contentView
.
Dans ma méthode loadView
, j'enregistre la cellule comme suit: [self.collectionView registerClass:[ImageCell class] forCellWithReuseIdentifier:@"MyCell"];
Voici ma méthode cellForItemAtIndexPath
:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MyCell" forIndexPath:indexPath];
// cell customization
return cell;
}
Lorsque je l'exécute, dès qu'il atteint la ligne de retrait, il se bloque avec l'erreur suivante:
*** 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'
J'ai fatigué de configurer une cellule personnalisée et je l'ai utilisée comme classe et j'ai eu la même erreur. Ma cellule personnalisée sous-classe UICollectionViewCell et n'a rien implémenté, à l'exception de la valeur par défaut initWithFrame
. C'est parce que je voulais juste changer la couleur d'arrière-plan de la vue. Je ne sais pas quel est le problème, mais quelqu'un pourrait-il s'il vous plaît jeter un œil à mon code et m'aider? J'essaie de comprendre cela depuis un bon moment sans aucune chance.
Si vous souhaitez simplement afficher une image, vous n'avez pas besoin de faire de sous-classement, vous pouvez définir le backgroundColor
de la cellule avec colorWithPatternImage:
. Enregistrez la classe comme ceci:
[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"Cell"];
Ensuite, utilisez-le comme ceci:
- (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;
}
Dans cet exemple, le résultat est un array
de UIImages
.
Si vous utilisez xib en applivation, ajoutez ensuite ce qui suit dans votre méthode viewdidLoad
[self.myCollectionView registerNib:[UINib nibWithNibName:@"CollectionViewCell" bundle:nil] forCellWithReuseIdentifier:@"CellIdentifier"];
sinon, si vous utilisez le storyboard, ajoutez ce qui suit
[self.myCollectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"CellIdentifier"];
Enfin, ajoutez ceci (sinon)
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CellIdentifier" forIndexPath:indexPath];
return cell;
}
L'espoir ci-dessus vous aidera.
Essayez de définir un point d'arrêt sur
[self.collectionView registerClass:[ImageCell class] forCellWithReuseIdentifier:@"MyCell"];
Je suppose que votre méthode loadView (vouliez-vous dire viewDidLoad?) N'est pas appelée, donc la classe n'est jamais enregistrée avec la collectionView.
si votre vue de collection est connectée sur le storyboard et que le délégué et la source de données y sont définis, et que vous fournissez les méthodes nécessaires pour la source de données et le délégué, l'ajout de l'appel de registre rend le
- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath
retourne un UICollectionView
au lieu de sa propre sous-classe. Faites donc l'un ou l'autre, mais pas les deux.
définissez le nom de votre identifiant de cellule comme dans le code