DadEap Purple
DadEap Purple

Reputation: 91

Exception when creating collectionViewCell

I'm trying to create a simple View : a tableView which takes like 80% of the screen, and a collectionView with 4 rows at the bottom. Everything works fine with my tableView but I can't get things right with my collectionView. I always get the following exception :

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

I've been looking in my View Controller : there are 2 refering outlets for my collectionVIew : datasource and delegate. So it's fine. And I'm using the method "withReuseIdentifier" so I don't have to declare an identifier in the nib. I've been trying to create a property for collectionView, but it changes nothing.

So I really don't see what I am missing ...

.h :

#import <UIKit/UIKit.h>

@interface MainViewController : UIViewController <UITableViewDelegate, 
    UITableViewDataSource, UICollectionViewDelegate, UICollectionViewDataSource>
@end

.m :

#import "MainViewController.h"

    @interface MainViewController ()

@end

@implementation MainViewController {
    NSArray *recipes;
    NSArray *images; }

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self; }

- (void)viewDidLoad {
    [super viewDidLoad];
    recipes = [NSArray arrayWithObjects:@"Label1", @"Label2", @"Label3", @"Label4", @"Label5", @"Label6", @"Label7", @"Label8", @"Label9", @"Label10", @"Label11", @"Label12", @"Label13", @"Label14", @"Label15", nil];

    images = [NSArray arrayWithObjects:@"img1", @"img2", @"img3", @"img4", nil];
    // Do any additional setup after loading the view. }

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated. }

#pragma mark TableView methods

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [recipes count]; }

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:    
        (NSIndexPath  *)indexPath
    {
    static NSString *simpleTableIdentifier = @"SimpleTableCell";

    UITableViewCell *cell = [tableView  
        dequeueReusableCellWithIdentifier:simpleTableIdentifier];
        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault     
                     reuseIdentifier:simpleTableIdentifier];
        }
        cell.textLabel.text = [recipes objectAtIndex:indexPath.row];
        return cell;
    }

    #pragma mark CollectionView methods

    - (NSInteger) numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
        return 1;
    }

    - (NSInteger)collectionView:(UICollectionView *)collectionView   
          numberOfItemsInSection: (NSInteger)section {
        return [images count];
    }

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

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

        return cell;
    }

    @end

Thanks in advance !

Upvotes: 0

Views: 520

Answers (3)

Shankar BS
Shankar BS

Reputation: 8402

Oky u can try with this, just a simple way,

  • First create a new file in user interface select view and name as NibCell.
  • Then select the device (choose any one of them).
  • Delete what ever the content in the view.
  • Just drag and drop a new CollectionViewCell that's it.. :)
  • in the collectinview cell u can add image view (or any other objects u want) and set its tag to access.

for example

in viewDidLoad method

- (void)viewDidLoad
  {
     [super viewDidLoad];

     //....other code

     //nib register
      UINib *cellNib = [UINib nibWithNibName:@"NibCell" bundle:nil];
      [_collectionView registerNib:cellNib forCellWithReuseIdentifier:@"Cell"];
  }

and in this method

   -(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
   {
      static NSString *cellIdentifier = @"Cell"; //u know the identifier
      UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath]; //get the cell
      UILabel *titleLabel = (UILabel *)[cell viewWithTag:100]; //for example i put a label and set it's tag to 100 and i an accessing it
     [titleLabel setText:cellData];
     return cell;

   }

Upvotes: 1

Vinaykrishnan
Vinaykrishnan

Reputation: 768

You have To register your collection view cell

[self.dashBoardCollection registerNib:[UINib nibWithNibName:@"DashBoardCell" bundle:nil] forCellWithReuseIdentifier:@"DashBoardCell"];

may be in identity Inspector your are missing to name the Classenter image description here

Upvotes: 1

Dhrumil
Dhrumil

Reputation: 3204

Make sure you have set the proper Custom Class(if any) as well as the Cell Identifier for the Collection View Cells in the Interface builder. Check this Screenshot.

enter image description here

This is for the Custom Class and the one below is for Cell Identifier.

enter image description here

The Identifier in your case is "cell". Make sure you have these set. They might be the problem here. Also the Class name of your CollectionViewCell and the one in your cellForItemAtIndexPath should be same.

Hope this helps.

Upvotes: 1

Related Questions