2012-09-26 22 views
25

ich den Fehler bekommen ...iOS Assertionsfehler in UICollectionView

*** Assertion failure in -[UICollectionView _dequeueReusableViewOfKind:withIdentifier:forIndexPath:], /SourceCache/UIKit/UIKit-2372/UICollectionView.m:2249 

Beim Versuch, eine UICollectionView anzuzeigen.

Die Linien verursacht es sind ...

static NSString *CellIdentifier = @"Cell"; 

UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath]; 

Fehler am dequeue geschieht.

Da gibt es keine anderen Fehler, so dass ich kämpfe um zu wissen, wo ich damit anfangen soll.

Kann jemand dieses Licht beleuchten?

Antwort

27

, die Dokumente zu lesen (sollte möglicherweise getan haben, diese erste :))

Wie auch immer, die Collection Ich verwende ist in einem separaten xib Datei (kein Storyboard) und aus der Dokumentation ...

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

Dank

+0

Wann nennst du diese Methode? in der Zeile vor "UICollectionViewCell * cell = [collectionView dequeue ..." oder in einer anderen Methode –

+1

musste ich es in der viewDidLoad Methode registrieren. Sie müssen die Xib nur einmal für die gesamte CollectionView registrieren. Wenn Sie dann dequeueCellWithIdentifier aufrufen, wird es an die Xib weitergeleitet, die Sie registriert haben. – Fogmeister

+2

Ich hatte das gleiche Problem, aber aus irgendeinem Grund erkannte der Compiler die 'registerClass'-Methode in 'viewDidLoad' nicht, also musste ich es in die' cellForItemAtIndexPath'-Methode verschieben. –

0

ersetzen

NSString *CellIdentifier = @"Cell"; 

mit

static NSString *CellIdentifier = @"Cell"; 
+0

Versuchte das zuerst. Ich habe gerade die Dokumente gelesen. Ich muss eine Klasse oder eine Feder registrieren, bevor Sie aus der Warteschlange ... – Fogmeister

36

Sie müssen wie unten registrieren:

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

Stellen Sie sicher, dass, wenn Sie die registerNib: Methode:

UINib *nibH = [UINib nibWithNibName:HEADER_ID bundle:nil]; 
[collectionView registerNib:nibH 
forSupplementaryViewOfKind:UICollectionElementKindSectionHeader 
     withReuseIdentifier:HEADER_ID]; 

dass AUCH in der Nib-Datei, wenn Sie Wählen Sie die wiederverwendbare Ansicht der obersten Ebene für die Sammlung aus, verwenden Sie den Attribut-Inspektor, und stellen Sie sicher, dass auf Identifier eingestellt ist der gleiche Wert, den Sie an den Parameter withReuseIdentifier: übergeben.

0

Ich habe diesen Fehler Pop-up sehen, wenn Sie mehrere UICollectionViews mit eindeutigen ReuseIdentifiers verwenden. In ViewDidLoad möchten Sie jedes Collection des reuseIdentifier wie so registrieren:

[_collectionView1 registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"collectionView1CellIdentifier"]; 
[_collectionView2 registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"collectionView2CellIdentifier"]; 

Dann, wenn Sie zu erhalten "- (UICollectionViewCell *) Collection: (UICollectionView *) Collection cellForItemAtIndexPath: (NSIndexPath *) indexPath" Sie sicherstellen möchten, dass Sie nicht versuchen, eine Zelle für collectionView1 auf den reuseIdentifier für collectionView2 festzulegen, oder Sie erhalten diesen Fehler.

tun dies nicht: (Oder collectionView2 wird die falsche Nummer sehen und einen Anfall werfen, bevor die Kennung es erwartete sehen)

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

if(collectionView != _collectionView1){ 
    cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"collectionView2CellIdentifier" forIndexPath:indexPath]; 
} 

cell.backgroundColor = [UIColor greenColor]; 
return cell; 

tun dies:

UICollectionViewCell *cell; 

if(collectionView == _collectionView1){ 
    cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"collectionView1CellIdentifier" forIndexPath:indexPath]; 
}else{ 
    cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"collectionView2CellIdentifier" forIndexPath:indexPath]; 
} 

cell.backgroundColor = [UIColor greenColor]; 
return cell; 
1

Ich hatte das gleiche Problem. Hier ist, wie ich es gelöst habe.

Verschieben

[self.pictureCollectionView registerNib:[UINib nibWithNibName: bundle:nil] forCellWithReuseIdentifier:reuseID]

in - (void)viewDidLoad, sein

eher als Methode - (void)awakeFromNib.

Verwandte Themen