web-dev-qa-db-fra.com

UICollectionView cellForItemAtIndexPath n'enregistre pas la cellule

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.

31
darksky

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.

60
rdelmar

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.

14
Gagan_iOS

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.

8
Charlie Elliott

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.

7
Zsolt

définissez le nom de votre identifiant de cellule comme dans le code

enter image description here

4
codercat