创建collectionViewCell时出现异常

时间:2014-06-30 10:16:01

标签: ios objective-c uicollectionview

我正在尝试创建一个简单的视图:一个占用80%屏幕的tableView,以及一个底部有4行的collectionView。我的tableView一切正常,但我无法用我的collectionView搞定。我总是得到以下例外:

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

我一直在查看我的View Controller:我的collectionVIew有两个引用出口:datasource和delegate。所以没关系。我正在使用方法“withReuseIdentifier”,所以我不必在nib中声明一个标识符。我一直在尝试为collectionView创建一个属性,但它什么都没改变。

所以我真的不明白我错过了什么......

.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

提前致谢!

3 个答案:

答案 0 :(得分:1)

确保在“界面”构建器中设置了正确的自定义类(如果有)以及“集合视图单元”的“单元标识符”。检查此屏幕截图。

enter image description here

这适用于自定义类,下面的是单元格标识符。

enter image description here

您的案例中的标识符是“单元格”。确保你有这些设置。他们可能是这里的问题。您的CollectionViewCell的类名称和cellForItemAtIndexPath中的类名称应该相同。

希望这有帮助。

答案 1 :(得分:1)

Oky你可以试试这个,只是一个简单的方法,

  • 首先在user interface选择view中创建一个新文件,并将其命名为NibCell
  • 然后选择设备(选择其中任何一个)。
  • 删除视图中的内容。
  • 只需拖放一个新的CollectionViewCell即可......:)
  • 在collectinview单元格中
  • 你可以添加图片视图(或任何你想要的其他对象)并设置其标签以进行访问。

例如

viewDidLoad方法

中的

- (void)viewDidLoad
  {
     [super viewDidLoad];

     //....other code

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

并在此方法中

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

   }

答案 2 :(得分:1)

您必须注册您的集合视图单元格

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

可能在身份检查器中缺少您的类enter image description here