0

我有一个承载 UICollectionview 的故事板,在 collectionviewcontroller 中我实现了

 - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView
              cellForItemAtIndexPath:(NSIndexPath *)indexPath
 {
   itemViewCell *itemCell =
   [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier
                                         forIndexPath:indexPath];

   return itemCell;
 }

但在 dequeueReusableCellWithReuseIdentifier 应用程序抛出此异常:

 [__NSCFConstantString initWithFrame:]: unrecognized selector sent to instance 0x7443c60

所以我的第一个倾向是查看我正在创建的自定义单元格,只是为了确保我有该方法的实现,并且我确实这样做了

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
       self.backgroundColor = [UIColor whiteColor];
    }
    return self;
} 

当然,我正在 viewdidload 中注册该单元格

 [super viewDidLoad];   
 [self.collectionView registerClass:[CellIdentifier class]
       forCellWithReuseIdentifier:CellIdentifier];

但我不认为这是相关的,因为我在 initWithFrame 方法上放了一个断点,它永远不会变热。我究竟做错了什么。

4

1 回答 1

3

根据文档:

如果一个现有单元可用,此方法会使现有单元出列,或者根据您之前注册的类或 nib 文件创建一个新单元。

并继续:

重要提示:在调用此方法之前,您必须使用 registerClass:forCellWithReuseIdentifier: 或 registerNib:forCellWithReuseIdentifier: 方法注册类或 nib 文件。

您需要实现其中一种方法,因为dequeueReusableCellWithReuseIdentifier: forIndexPath:可能需要创建一个对象并且需要上述方法来执行此操作。也许您已经创建了这些并且没有显示它们。如果您已经实现了其中之一,您可以展示您的代码吗?

更新:

根据您viewDidLoad和您收到的错误消息,它看起来像CellIdentifier一个NSString. 当您打电话时,[CellIdentifier class]您将一个字符串注册为使用类,而不是一个单元格。你需要把你正在使用的类放在这里。根据您的实现,您似乎会使用[itemViewCell class].

正如您所知,您应该始终将类大写。因此,如果itemViewCell是一个实际的类,则应将其更改为,ItemViewCell并且属性和变量名称应为小写(因此cellIdentifervs CellIdentifier)。

于 2013-06-26T16:30:05.487 回答