2012-09-29 15 views
29

Sto tentando di utilizzare UICollectionViewCell, poiché tutto ciò che voglio visualizzare è un'immagine. Posso aggiungere l'immagine alla cella utilizzando UIColor colorWithImage: nella proprietà contentView di UICollectionViewCell.UICollectionView cellForItemAtIndexPath non registra la cella

Nel mio metodo loadView, sto registrando la cellula come segue: [self.collectionView registerClass:[ImageCell class] forCellWithReuseIdentifier:@"MyCell"];

Di seguito è riportato il mio metodo cellForItemAtIndexPath:

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

quando l'eseguo, non appena colpisce la linea dequeue, si blocca con il seguente errore:

*** 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' 

Mi sono stancato di impostare una cella personalizzata e ho utilizzato i t come la classe e ho avuto lo stesso errore. La mia cella personalizzata ha sottoclasse UICollectionViewCell e non ha implementato nulla, ad eccezione del valore predefinito initWithFrame. Questo perché volevo solo cambiare il colore di sfondo della vista. Non sono sicuro di quale sia il problema ma qualcuno potrebbe per favore dare un'occhiata al mio codice e aiutarmi? Ho cercato di capirlo per un bel po 'con assolutamente nessuna fortuna.

risposta

60

Se si desidera solo visualizzare un'immagine, non è necessario eseguire alcuna sottoclasse, è possibile impostare la cella backgroundColor con colorWithPatternImage:. Registrare la classe come questa:

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

quindi utilizzarlo in questo modo:

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

In questo esempio, i risultati è un array di UIImages.

8

provare a impostare un punto di interruzione

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

direi tua loadview (Cercavi viewDidLoad?) Metodo non essere chiamato, quindi la classe non è mai registrato con il CollectionView.

6

se la vostra vista collezione è collegato sul storyboard e il delegato e origine dati è impostato lì, e si forniscono i metodi necessari per l'origine dati e delegato, aggiungendo poi la chiamata registro rende il ritorno

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

un UICollectionView invece della tua sottoclasse. Quindi, ma non entrambi.

+1

Grazie per questo! Mi stava facendo impazzire :) –

+0

Se vuoi usare Xib, puoi trovare la risposta in questo documento [UICollectionView aggiungendo UICollectionCell] (http://stackoverflow.com/questions/15184968/uicollectionview-adding-uicollectioncell). – Autobots

4

impostare il proprio nome identificativo cella come nel codice

enter image description here

+0

Sì, insieme alla registrazione della vista raccolta in viewDidLoad ha funzionato. Sono riuscito a provocarmi un po 'di dolore nella chiamata di dequeue per un po'. Avevo "Cell", cioè con un vuoto estraneo, che ovviamente non è lo stesso di "Cell", quindi sii molto attento ai tuoi nomi. – TJA

12

Se si utilizza XI ter in applivation quindi aggiungere seguente nel metodo viewDidLoad

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

altrimenti Se si utilizza storyboard aggiungere seguente

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

Infine un dd this (If not)

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

La speranza di cui sopra aiuterà.

+2

Grazie, mi ricorda registrati "Pennino", buona fortuna! – Resty

+0

Grazie mille. Il tuo primo frammento era quello che stavo cercando :) – Mexx

+0

Sto usando storyboard e mt custom cell non è una cosa da escludere? –

Problemi correlati