39

首先使用集合视图并遇到此错误:

由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无法使类型视图出列:带有标识符 Cell 的 UICollectionElementKindCell - 必须为标识符注册一个 nib 或一个类或连接故事板中的原型单元格”

代码很简单,如下图。我一生都无法弄清楚我错过了什么。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
cell.backgroundColor = [UIColor whiteColor]; 
return cell;
}

集合视图控制器是使用 nib 创建的,并且委托和数据源都设置为文件的所有者。

View Controller 的头文件也很基础。

@interface NewMobialViewController_3 : UICollectionViewController <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>
@end
4

15 回答 15

42

来自dequeue 方法的UICollectionView 文档:

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

于 2013-02-25T07:41:36.300 回答
30

您需要在 dequeueReusableCellWithReuseIdentifier 的参数和 UICollectionViewCell 的属性之间使用相同的标识符。

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

标识符

于 2014-10-21T01:29:59.947 回答
6

补充@jrtuton 所写的内容......你需要的是:

1) 注册您的 nib 文件以将其与您的标识符“连接”:

//MyCollectionView.m
- (void) awakeFromNib{
 [self registerNib:[UINib nibWithNibName:@"NibFileName" bundle:nil]   forCellWithReuseIdentifier: @"MyCellIdentifier"];
}

2)使用您的标识符从笔尖加载您的自定义单元格:

//MyCollectionView.m
- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath  *)indexPath {
    MyCustomCollectionViewCell* cell = [cv dequeueReusableCellWithReuseIdentifier:@"MyCellIdentifier" forIndexPath:indexPath];
}

3) 始终使用静态 NSString* 以避免在您的应用程序中再次使用相同的标识符。

于 2014-08-24T03:29:03.380 回答
4

我已经 100% 正确完成了所有工作。但由于某种原因,我在一个小时内遇到了同样的错误,然后我所做的是:

  1. 转到故事板
  2. 选择原型单元(在我的例子中)
  3. 从身份检查器中清除类名,然后重写它
  4. 在属性检查器中重写标识符名称

简单地说,即使我之前做对了,也重新做了这一步,就像 xcode 在特定的纳秒错过了一些东西!

于 2018-04-01T00:09:00.577 回答
4

斯威夫特 5

1)确保你有一个正确的双端队列用于 HEADER,你可能正在使用常规单元格。

override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
        let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: headerId, for: indexPath)
        return header
    }

2)双重检查注册(ViewDidLoad)

collectionView.register(HeaderCell.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: headerId)
于 2019-05-14T04:57:11.633 回答
3

斯威夫特4.0

每当您当时UITableViewCellxib时,您都必须在UITableView.

override func viewDidLoad(){
    super.viewDidLoad()

    self.yourtableview.register(UINib(nibName: "yourCellXIBname", bundle: Bundle.main), forCellReuseIdentifier: "YourCellReUseIdentifier")
   }
于 2018-06-28T10:39:27.423 回答
2

如果项目有多个 ViewController,请务必检查 ViewController 自定义类是否正确。然后确保 "collectionView.dequeueReusableCell(withReuseIdentifier: "ABC", for: indexPath) as?" 与 Collection View 内的 Collection Reusable View 中使用的标识符匹配。

于 2021-01-18T08:33:54.957 回答
1

如果您使用的是故事板而不是 xib,这里有几个步骤。

  1. 确保填写正确的单元格标识符。

原型细胞属性面板

  1. 在ColletionViewDelegate 中。

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "YourCellName", for: indexPath)as! YourCellName
        return cell            
    }
    
  2. 就是这样。您也不想添加registerClass:forCellWithReuseIdentifier:这将导致元素 nil 错误。

于 2018-06-28T10:04:30.603 回答
0

您需要在情节提要中提供正确的可重用标识符,您在注册 collectionViewCell 时已在代码中提供了该标识符。

这是代码。

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ClctnVC", for: indexPath)as! ClctnVC
    return cell            
}
于 2018-02-14T05:11:31.140 回答
0

对我来说解决这个问题的方法与 Omar 的回答(大致)相同,除了我最终创建了一个新的 UICollectionViewCell 自定义类并为 Cell Reuse Indentifier 提供了一个新的/不同的名称,而不是我在应用程序中其他地方使用的名称。在那之后它立即起作用。

于 2018-10-19T01:25:32.623 回答
0

以防万一,如果您在 Attributes Inspector -> Identifier 字段中的正确位置使用情节提要设置 collectionView 标识符。不在“恢复 ID”中的类名下。

如果您在 tableView 单元格中使用集合视图,请将委托添加到不在 tableViewController 中的 tableView 单元格。

于 2019-12-17T15:44:08.447 回答
0

我有同样的问题。
当我创建一个 CollectionViewController 时,默认reuseIdentifierCell大写C的,但是我犯了一个错误,将我的单元格标识符Storyboard设置为cell
它们必须相同。

于 2020-08-18T12:49:02.087 回答
0

如果您曾经尝试解决另一个问题的解决方案,但代码中的语法正确,插座 UI 正确。

你应该检查你的 tableview 或 collectionview 然后检查你是否忘记了 set delegate "tableview.delegate = self or collectionview.delegate = self"

collectionview.delegate = self
collectionview.dataSource = self

在我的情况下,只有您在单元格中设计集合重叠集合。

在此处输入图像描述

谢谢你。

于 2021-06-09T04:31:46.123 回答
-1

我知道这是一个旧问题,但我遇到了同样的问题,并想分享为我解决的问题。

就我而言,我已经声明了一个全局标识符

let identifier = "CollectionViewCell"

并且在使用它之前必须使用self

collectionView.dequeueReusableCellWithReuseIdentifier(self.identifier, forIndexPath: indexPath) as! CollectionViewCell

希望这可以帮助某人:)

于 2016-08-09T08:25:22.157 回答
-1

如果您通过代码创建它,则必须创建一个自定义UICollectionViewCell,然后,初始化一个UICollectionView,并用于loadView设置视图是UICollectionView您创建的。如果您在 中创建viewDidload(),它不起作用。另外,你也可以拖动一个UICollectionViewController,这样可以节省很多时间。

于 2017-05-03T15:09:53.770 回答