UICollectionView cellForItemAtIndexPath未注册单元格

时间:2012-09-29 23:33:40

标签: objective-c ios xcode ipad uicollectionview

我正在尝试使用UICollectionViewCell,因为我想要显示的只是一张图片。我可以使用UIColor colorWithImage: UICollectionViewCell属性上的contentView将图片添加到单元格中。

在我的loadView方法中,我正在注册单元格如下: [self.collectionView registerClass:[ImageCell class] forCellWithReuseIdentifier:@"MyCell"];

以下是我的cellForItemAtIndexPath方法:

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

当我运行它时,一旦它到达出列线,它就会崩溃并出现以下错误:

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

我累了设置自定义单元格,并将其用作类,我得到了同样的错误。我的自定义单元子类化了UICollectionViewCell并且没有实现,除了默认的initWithFrame。那是因为我想改变视图的背景颜色。我不确定问题是什么,但有人可以看看我的代码并帮助我吗?我一直在努力解决这个问题很长一段时间,完全没有运气。

5 个答案:

答案 0 :(得分:60)

如果您只想显示图像,则无需进行任何子类化,您可以使用backgroundColor设置单元格colorWithPatternImage:。像这样注册课程:

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

然后像这样使用它:

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

在此示例中,结果为array的{​​{1}}。

答案 1 :(得分:14)

如果您在applivation中使用xib,请在viewdidLoad方法中添加以下内容

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

否则如果您使用storyboard添加以下

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

最后添加(如果没有)

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

希望以上将有所帮助。

答案 2 :(得分:8)

尝试在

上设置断点
[self.collectionView registerClass:[ImageCell class] forCellWithReuseIdentifier:@"MyCell"];

我猜你的loadView(你的意思是viewDidLoad?)方法没有被调用,所以这个类永远不会在collectionView中注册。

答案 3 :(得分:7)

如果您的集合视图在storyboard上连接并且在那里设置了委托和数据源,并且您为数据源和委托提供了必要的方法,那么添加注册调用会使

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

返回UICollectionView而不是你自己的子类。所以要么做到,要么不是两者。

答案 4 :(得分:4)

设置您的单元格标识符名称,如代码

enter image description here