29

我收到错误...

*** Assertion failure in -[UICollectionView _dequeueReusableViewOfKind:withIdentifier:forIndexPath:], /SourceCache/UIKit/UIKit-2372/UICollectionView.m:2249

尝试显示 UICollectionView 时。

导致它的线条是......

static NSString *CellIdentifier = @"Cell";

UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];

出队发生错误。

没有其他错误,所以我很难知道从哪里开始。

任何人都可以阐明这一点吗?

4

7 回答 7

37

您需要像下面这样注册:

[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"MY_CELL"];
于 2012-11-10T10:53:43.790 回答
29

一直在阅读文档(应该先这样做:))

无论如何,我正在使用的 collectionView 位于单独的 xib 文件(不是故事板)中,并且来自文档......

Important: You must register a class or nib file using the
registerClass:forCellWithReuseIdentifier: or
registerNib:forCellWithReuseIdentifier: method before calling this method.

谢谢

于 2012-09-26T10:48:34.077 回答
4

我有同样的问题。这是我解决它的方法。

移动

[self.pictureCollectionView registerNib:[UINib nibWithNibName: bundle:nil] forCellWithReuseIdentifier:reuseID]

- (void)viewDidLoad,

而不是方法- (void)awakeFromNib

于 2016-06-05T10:00:58.897 回答
3

确保如果您使用该registerNib:方法:

UINib *nibH = [UINib nibWithNibName:HEADER_ID bundle:nil];
[collectionView registerNib:nibH
 forSupplementaryViewOfKind:UICollectionElementKindSectionHeader 
        withReuseIdentifier:HEADER_ID];

同样在nib文件中,当您选择顶级集合可重用视图时,使用属性检查器,并确保Identifier其设置为与您传递给withReuseIdentifier:参数的值相同的值。

于 2013-02-05T15:58:36.263 回答
1

只在 iOS 9 上遇到了这个崩溃(iOS 10/11 工作正常)。

我没有 Flow Layout 的自定义子类,而是headerReferenceSize直接在现有的子类上设置。所以在启用Section Header的Interface Builder中我遇到了这个崩溃,没有复选标记一切正常并且标题显示正确,因为我在代码中设置了大小。

在此处输入图像描述

于 2018-09-12T15:40:29.277 回答
0

代替

NSString *CellIdentifier = @"Cell";

static NSString *CellIdentifier = @"Cell";
于 2012-09-26T10:41:03.927 回答
0

当使用具有唯一 ReuseIdentifiers 的多个 UICollectionViews 时,我看到此错误弹出。在 ViewDidLoad 你想像这样注册每个 CollectionView 的重用标识符:

[_collectionView1 registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"collectionView1CellIdentifier"];
[_collectionView2 registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"collectionView2CellIdentifier"];

然后,当您到达“- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath”时,您要确保不要尝试将 collectionView1 的单元格设置为 collectionView2 的重用标识符,或者您会得到这个错误。

不要这样做:(或者collectionView2会看到错误的标识符并在看到它所期望的标识符之前抛出一个合适的)

UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"collectionView1CellIdentifier" forIndexPath:indexPath];

if(collectionView != _collectionView1){
   cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"collectionView2CellIdentifier" forIndexPath:indexPath];
}

cell.backgroundColor = [UIColor greenColor];
return cell;

这样做

UICollectionViewCell *cell;

if(collectionView == _collectionView1){
    cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"collectionView1CellIdentifier" forIndexPath:indexPath];
}else{
   cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"collectionView2CellIdentifier" forIndexPath:indexPath];
}

cell.backgroundColor = [UIColor greenColor];
return cell;
于 2015-04-15T13:20:31.880 回答