Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UICollectionView cellForItemAtIndexPath not registering cell

I am trying to use UICollectionViewCell, since all I want to display is an image. I can add the image to the cell using UIColor colorWithImage: on the UICollectionViewCell's contentView property.

In my loadView method, I am registering the cell as follows: [self.collectionView registerClass:[ImageCell class] forCellWithReuseIdentifier:@"MyCell"];

Below is my cellForItemAtIndexPath method:

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

When I run it, as soon as it hits the dequeue line, it crashes with the following error:

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

I tired setting up a custom cell, and used it as the class and I got the same error. My custom cell subclassed UICollectionViewCell and had nothing implemented, except for the default initWithFrame. That is because I wanted to just change the background colour of the view. I am not sure what the problem is but could someone please take a look at my code and help me? I've been trying to figure this out for quite a while with absolutely no luck at all.

like image 620
darksky Avatar asked Sep 29 '12 23:09

darksky


3 Answers

If you just want to display an image, you don't need to do any subclassing, you can set the cell's backgroundColor with colorWithPatternImage:. Register the class like this:

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

Then use it like so:

- (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 this example, results is an array of UIImages.

like image 87
rdelmar Avatar answered Oct 20 '22 12:10

rdelmar


If you are using xib in applivation then add following in your viewdidLoad method

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

otherwise If you using storyboard add following

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

Finally add this (If not)

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

Hope above will help.

like image 27
Gagan_iOS Avatar answered Oct 20 '22 13:10

Gagan_iOS


Try setting a breakpoint on

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

I would guess your loadView (did you mean viewDidLoad?) method is not being called, so the class is never registered with the collectionView.

like image 8
Charlie Elliott Avatar answered Oct 20 '22 12:10

Charlie Elliott