UICollectionView中的iOS断言失败

时间:2012-09-26 10:39:14

标签: iphone ios uicollectionview

我收到了错误......

*** 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];

出列时发生错误。

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

有人能说清楚这个吗?

7 个答案:

答案 0 :(得分:37)

您需要注册如下:

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

答案 1 :(得分:29)

正在阅读文档(应该首先完成这个:))

无论如何,我使用的collectionView是在一个单独的xib文件(不是故事板)和文档中...

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

由于

答案 2 :(得分:3)

如果您使用registerNib:方法,请确保

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

nib文件中的 ALSO ,当您选择顶级集合可重用视图时,请使用属性检查器,确保 Identifier是设置为您传入withReuseIdentifier:参数的相同值。

答案 3 :(得分:2)

我遇到了同样的问题。以下是我如何解决它。

移动

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

位于- (void)viewDidLoad

而非方法- (void)awakeFromNib

答案 4 :(得分:1)

我仅在iOS 9上崩溃了(iOS 10/11正常工作)。

我没有Flow Layout的自定义子类,而是直接在现有的子类上设置headerReferenceSize。 因此,在启用了 Section Header 的Interface Builder中,发生了此崩溃,没有选中标记,一切都正常运行,并且由于我在代码中设置了大小,因此标题正确显示。

enter image description here

答案 5 :(得分:0)

替换

NSString *CellIdentifier = @"Cell";

static NSString *CellIdentifier = @"Cell";

答案 6 :(得分:0)

在使用具有唯一ReuseIdentifier的多个UICollectionView时,我看到此错误弹出。在ViewDidLoad中,您想要注册每个CollectionView的reuseIdentifier,如下所示:

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

然后当你到达" - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath"你想确保你没有尝试将collectionView1的单元格设置为collectionView2的reuseIdentifier,否则你将收到此错误。

不要这样做 :(或者,在看到预期的标识符之前,collectionView2会看到错误的标识符并抛出拟合)

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

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

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

DO THIS

UICollectionViewCell *cell;

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

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