Fogmeister
Fogmeister

Reputation: 77661

iOS Assertion Failure in UICollectionView

I'm getting the error ...

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

When trying to display a UICollectionView.

The lines causing it are...

static NSString *CellIdentifier = @"Cell";

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

Error happening on the dequeue.

There are no other errors so I'm struggling to know where to begin with this.

Can anyone shed light on this?

Upvotes: 29

Views: 29830

Answers (7)

heyfrank
heyfrank

Reputation: 5647

I got this crash on iOS 9 only (iOS 10/11 are working fine).

I had no custom subclass of a Flow Layout but setting the headerReferenceSize on the existing one directly. So in Interface Builder with Section Header enabled I got this crash, without the checkmark everything works fine and the headers are being displayed correctly, since I set the size in code.

enter image description here

Upvotes: 1

U.Jhon
U.Jhon

Reputation: 41

I had the same problem. Here's how I solved it.

Move

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

to be in - (void)viewDidLoad,

rather than method - (void)awakeFromNib.

Upvotes: 4

Chris Klingler
Chris Klingler

Reputation: 5304

I have seen this error pop up when using multiple UICollectionViews with unique ReuseIdentifiers. In ViewDidLoad you want to register each CollectionView's reuseIdentifier like so:

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

Then when you get to "- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath" you want to make sure that you don't try to set a cell for collectionView1 to the reuseIdentifier for collectionView2 or you will get this error.

DON'T DO THIS: (Or collectionView2 will see the wrong Identifier and throw a fit before seeing the identifier it was expecting)

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

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

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

DO THIS:

UICollectionViewCell *cell;

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

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

Upvotes: 0

bshirley
bshirley

Reputation: 8356

Make sure that if you use the registerNib: method:

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

that ALSO in the nib file, when you select the top-level collection reusable view, use the attributes inspector, and make sure the Identifier is set to the same value you are passing in to the withReuseIdentifier: parameter.

Upvotes: 3

Gaurav Taywade
Gaurav Taywade

Reputation: 8347

You need to register like below:

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

Upvotes: 37

Fogmeister
Fogmeister

Reputation: 77661

Been reading the docs (should possibly have done this first :) )

Anyway, the collectionView I am using is within a separate xib file (not a storyboard) and from the docs...

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

Thanks

Upvotes: 29

CAMOBAP
CAMOBAP

Reputation: 5657

Replace

NSString *CellIdentifier = @"Cell";

with

static NSString *CellIdentifier = @"Cell";

Upvotes: 0

Related Questions