2014-06-30 2 views
0

J'essaie de créer une vue simple: une tableView qui prend comme 80% de l'écran, et une collectionView avec 4 lignes en bas. Tout fonctionne bien avec ma tableView mais je ne peux pas faire les choses correctement avec ma collectionView. Je reçois toujours l'exception suivante:Exception lors de la création de collectionViewCell

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

J'ai cherché dans mon View Controller: il y a 2 points de référenceurs pour mon CollectionView: délégué et source de données. Donc c'est bien. Et j'utilise la méthode "withReuseIdentifier" donc je n'ai pas besoin de déclarer un identifiant dans la plume. J'ai essayé de créer une propriété pour collectionView, mais cela ne change rien.

Je ne vois vraiment pas ce que je suis absent ...

.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 

Merci à l'avance!

+0

chèque story-board, vous n'avez pas identifiant donné pour la cellule de collecte « cellule ». – Pawan

Répondre

1

Assurez-vous que vous avez défini la classe personnalisée appropriée (le cas échéant) ainsi que l'identificateur de cellule pour les cellules de vue de collection dans le générateur Interface. Vérifiez cette capture d'écran.

enter image description here

C'est pour la classe personnalisée et celui ci-dessous est pour identificateur de cellule.

enter image description here

Le code d'identification dans votre cas est "cellule". Assurez-vous d'avoir ces ensembles. Ils pourraient être le problème ici. En outre, le nom de classe de votre CollectionViewCell et celui de votre cellForItemAtIndexPath doivent être identiques.

Espérons que cela aide.

+0

Définissez l'identificateur de la cellule créée. Mais ce que je ne comprends pas, c'est que je ne l'ai pas fait pour la tableView, et cela a fonctionné. De plus, dois-je créer une cellule dans la plume pour chaque cellule que je veux créer? –

+0

Non, ce n'est pas nécessaire. vous pouvez utiliser 'numberOfRowsInSection' pour générer dynamiquement le nombre de cellules requis. Sinon, vous avez la possibilité d'utiliser un nombre statique de cellules. –

1

Oky u peut essayer avec cela, juste une façon simple,

  • d'abord créer un nouveau fichier dans user interface sélectionner view et nom NibCell.
  • Puis sélectionnez l'appareil (choisissez l'un d'entre eux).
  • Supprimez le contenu de la vue.
  • Il suffit de glisser-déposer une nouvelle CollectionViewCell qui est tout .. :)
  • dans la cellule collectinview u peut ajouter vue de l'image (ou tout autre objet u want) et définir son étiquette d'accès.

par exemple

dans viewDidLoad méthode

- (void)viewDidLoad 
    { 
    [super viewDidLoad]; 

    //....other code 

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

et dans cette méthode

-(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; 

    } 
1

Vous devez enregistrer votre vue collection cellule

[auto.dashBoardCollection registerNib: [UINib nibWithNibName: @ "DashBoardCell" bundle: nil] pourCellWithReuseIdentifier: @ "DashBoardCell"];

peut-être dans l'inspecteur de l'identité de votre manquent pour nommer la classe enter image description here

Questions connexes