2

我正在尝试设置一个UICollectionView. 起初我使用的是 basic UICollectionViewCell,它运行良好,正在显示单元格。

然后我创建了自己的 collectionViewCell(子类UICollectionViewCell化),以便能够在单元格中显示图像。我将 Storyboard 中的自定义单元格与一个标识符相关联,并且我还为它指定了正确的类。

但是,我一直有这个错误,我不明白为什么:

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

我设法通过在中添加这一行来解决这个错误,viewDidLoad但在我关注的教程中,这些人没有使用它:

[self.collectionView registerClass:[MediaCollectionViewCell class] forCellWithReuseIdentifier:@"MediaCell"];

问题是如果我添加它,collectionView 仍然是黑色的并且没有数据显示。

4

3 回答 3

6

我昨天遇到了这个确切的问题(因为文档说您必须注册该类),但是文档不准确,因为如果您的情节提要中存在原型单元并且您给它一个标识符,则您不应该注册。

如果您UICollectionViewCell在情节提要中创建 的原型并分配您的自定义单元格类,则没有必要(如果这样做是有害的)注册自定义UICollectionViewCell. 这就是结果UICollectionView是黑色的原因。

根据错误消息,情节提要中的原型单元格的标识符设置不正确(根本未设置或未设置MediaCell

于 2012-12-24T17:21:50.960 回答
2

你是对的

[self.collectionView registerClass:[MediaCollectionViewCell class] forCellWithReuseIdentifier:@"MediaCell"]; 

因为这有助于细胞重用。

问题可能出在您的cellForRowAtIndexPath方法、您的子类或您设置委托的方式上。你可以发布代码吗?

您的委托方法应如下所示:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    MediaCollectionViewCell* cell = [self.collectionView dequeueReusableCellWithReuseIdentifier:@"MediaCell" forIndexPath:indexPath];
    // set cell.image
    return cell;
}

你应该在你的 viewDidLoad 方法中设置你的委托...

[self.collectionView setDataSource:self];
[self.collectionView setDelegate:self];

编辑:您可以发布您的 MediaCollectionViewCell 实现的代码吗?我做了类似的事情,我的看起来像这样。

- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
    // Initialization code
    self.imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)];
    [self.contentView addSubview:self.imageView];
}
return self;

}

于 2012-12-24T11:09:20.180 回答
1

这实际上是与 TabBarController 相关的问题。我没有在其中显示正确的类,这就是 collectionView 总是为空的原因。我在这里发布的代码正在运行。感谢大家的帮助。

于 2013-01-08T15:30:35.043 回答