2012-09-29 3 views
29

J'essaie d'utiliser UICollectionViewCell, puisque tout ce que je veux afficher est une image. Je peux ajouter l'image à la cellule en utilisant UIColor colorWithImage: sur la propriété contentView.UICollectionView cellForItemAtIndexPath ne pas enregistrer la cellule

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; 
} 

Quand je lance, dès qu'il frappe la ligne de dequeue, 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é la configuration d'une cellule personnalisée, et j'ai utilisé t comme la classe et j'ai eu la même erreur. Ma cellule personnalisée a sous-classé 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 de fond de la vue. Je ne sais pas quel est le problème, mais quelqu'un pourrait-il jeter un coup d'œil à mon code et m'aider? J'essayais de comprendre cela depuis un moment sans aucune chance du tout.

Répondre

60

Si vous voulez simplement afficher une image, vous n'avez pas besoin de faire de sous-classes, vous pouvez définir backgroundColor avec colorWithPatternImage:. Enregistrez la classe comme ceci:

[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"Cell"]; 

utiliser ensuite comme si:

- (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, les résultats est une array de UIImages.

8

Essayez la fixation d'un point d'arrêt sur

[self.collectionView registerClass:[ImageCell class] forCellWithReuseIdentifier:@"MyCell"]; 

Je suppose que votre loadview (avez-vous dire viewDidLoad?) Méthode n'est pas appelée, si la classe est jamais enregistrée auprès du CollectionView.

6

si votre vue collection est connecté sur story-board et le délégué et source de données est définie là-bas, et vous fournir les méthodes nécessaires à la source de données et délégué, puis en ajoutant l'appel de registre fait l'

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath 

retour d'un UICollectionView au lieu de votre propre sous-classe. Donc, faites l'un ou l'autre mais pas les deux.

+1

Merci pour votre aide! Ça me rendait fou :) –

+0

Si vous voulez utiliser Xib, vous pouvez trouver la réponse dans ce document [UICollectionView en ajoutant UICollectionCell] (http://stackoverflow.com/questions/15184968/uicollectionview-adding-uicollectioncell). – Autobots

4

définir votre nom d'identifiant de cellule dans le code

enter image description here

+0

Oui, cela avec l'enregistrement de la vue de la collection dans viewDidLoad a fait l'affaire. J'ai réussi à me causer du chagrin dans l'appel de dequeue pendant un moment. J'ai eu "Cell", c'est-à-dire avec un blanc étranger, qui n'est bien sûr pas le même que "Cell", alors faites très attention à vos noms. – TJA

12

Si vous utilisez xib dans applivation puis ajoutez ce qui suit dans votre méthode viewDidLoad

[self.myCollectionView registerNib:[UINib nibWithNibName:@"CollectionViewCell" bundle:nil] forCellWithReuseIdentifier:@"CellIdentifier"]; 

autrement Si vous à l'aide d'ajouter storyboard suivant

[self.myCollectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"CellIdentifier"]; 

Enfin un dd this (Si non)

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CellIdentifier" forIndexPath:indexPath]; 
return cell; 
} 

L'espoir ci-dessus aidera.

+2

Merci, rappelle-moi m'enregistrer "Nib", bonne chance! – Resty

+0

Merci beaucoup. Votre premier extrait était ce que je cherchais :) – Mexx

+0

J'utilise storyboard & mt cellule personnalisée n'est pas dequeue aucune idée? –

Questions connexes