2013-02-25 21 views
20

Prendendo primo tuffo con vista di raccolta e sono in esecuzione in questo errore:errore non poteva dequeue una visione di tipo UICollectionElementKindCell

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'could not dequeue a view of kind: UICollectionElementKindCell with identifier Cell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'

il codice è molto semplice, come illustrato di seguito. Non posso per la vita di me capire cosa mi manca.

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath]; 
cell.backgroundColor = [UIColor whiteColor]; 
return cell; 
} 

Il controller della vista collezione è stata creata usando un pennino e delegati & origini dati sono entrambi impostati proprietario del file.

Visualizza Il file di intestazione del controller è anche molto semplice.

@interface NewMobialViewController_3 : UICollectionViewController <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout> 
@end 
+11

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

risposta

28

Dal UICollectionView documentation per il metodo dequeue:

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

+0

cosa devo fare se uso il defalt UICollectionViewCell non personalizzato uno – Mani

+0

Registrate la classe base invece di una classe personalizzata. Ma quasi sempre vuoi una sottoclasse. La cella predefinita non contiene nulla. – jrturton

+0

Sì, capito grazie @jrturton – Mani

6

A complemento di quanto @jrtuton scritto ... Quello che vi serve è:

1) Iscrivere il vostro file nib "collegare" si con il tuo identificativo:

//MyCollectionView.m 
- (void) awakeFromNib{ 
[self registerNib:[UINib nibWithNibName:@"NibFileName" bundle:nil] forCellWithReuseIdentifier: @"MyCellIdentifier"]; 
} 

2) Usa il tuo identificativo per caricare la tua cella personalizzata da un pennino:

//MyCollectionView.m 
- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
    MyCustomCollectionViewCell* cell = [cv dequeueReusableCellWithReuseIdentifier:@"MyCellIdentifier" forIndexPath:indexPath]; 
} 

3) Usare sempre NSString statica * per evitare nuovamente gli stessi identificatori nella vostra applicazione.

21

È necessario utilizzare lo stesso identificatore tra l'argomento dequeueReusableCellWithReuseIdentifier e la proprietà di UICollectionViewCell.

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

identifier

+0

Grazie !!!!!! –

+0

Come registrare Identifier per UITableViewCell aggiunto UICollectionView? – kiran

1

So che questo è un vecchio, ma ho sperimentato lo stesso problema e ha voluto condividere ciò che ha risolto il tutto per me.

Nel mio caso, ho dichiarato un identificatore globale

let identifier = "CollectionViewCell" 

e ha dovuto usare auto destra prima di utilizzarlo:

collectionView.dequeueReusableCellWithReuseIdentifier(self.identifier, forIndexPath: indexPath) as! CollectionViewCell 

Spero che questo aiuti qualcuno :)

-1

Se lo si crea per codice, è necessario creare un numero personalizzato UICollectionViewCell, Quindi, avviare un UICollectionView, e utilizzare loadView per impostare la vista è il UICollectionView che si crea. Se crei in viewDidload(), non funziona. Inoltre, puoi anche trascinare un UICollectionViewController, risparmiando un sacco di tempo.

0

È necessario fornire l'identificativo di riutilizzo corretto nello storyboard, che è stato fornito nel codice durante la registrazione di collectionViewCell.

Ecco il codice.

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ClctnVC", for: indexPath)as! ClctnVC 
    return cell    
} 
Problemi correlati