错误无法使类UICollectionElementKindCell的视图出列

时间:2013-02-25 01:55:12

标签: ios objective-c uicollectionview

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

  

由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无法使类型的视图出列:具有标识符的UICollectionElementKindCellCell - 必须为标识符注册一个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

15 个答案:

答案 0 :(得分:33)

从出列方法UICollectionView documentation开始:

  

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

答案 1 :(得分:24)

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

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

identifier

答案 2 :(得分:6)

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

1)将您的nib文件注册到&#34; connect&#34;它带有您的标识符:

//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 *以在您的应用中再次避免使用相同的标识符。

答案 3 :(得分:3)

我已经100%正确地完成了所有事情。 但由于某种原因,我得到相同的错误一个小时,然后我做的是:

  1. 转到故事板
  2. 选择原型单元格(在我的情况下)
  3. 从身份检查器中清除类名,然后重写它
  4. 在属性检查器
  5. 中重写标识符名称 简单地说,重做这一步即使我之前做的正确,它就像xcode在特定纳秒时错过了一些东西!

答案 4 :(得分:1)

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

就我而言,我已经宣布了一个全局标识符

let identifier = "CollectionViewCell"

在使用之前必须使用 self

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

希望这有助于某人:)

答案 5 :(得分:1)

Swift4.0

无论何时您的 define(['ojs/ojcore', 'knockout', 'jquery', 'appController','ojs/ojmodule','ojs/ojbutton'], function(oj, ko, $, app) { function CustomerViewModel() { var self = this; self.buttonClick = function(event){ // return true; }; // Header Config self.headerConfig = {'viewName': 'header', 'viewModelFactory': app.getHeaderModel()}; ko.components.register('my-component', { viewModel: { require: 'viewModels/register' }, template: { require: 'text!views/register.html' } }); } return new CustomerViewModel(); } ); xib ,您都必须向 <div class="oj-hybrid-applayout-page"> <div class="oj-applayout-fixed-top"> <!-- ** Oracle JET V4.2.0 hybrid mobile application header pattern. ** Please see the Oracle JET Cookbook App Shell: Hybrid Mobile demos for ** more information on how to use this pattern. --> <header role="banner" class="oj-hybrid-applayout-header" data-bind="ojModule: headerConfig"> </header> </div> <!-- This is where your main page content will be loaded --> <div class="oj-applayout-content"> <div role="main" class="oj-hybrid-applayout-content"> <div class="oj-hybrid-padding"> <h1>Hello Customer! Welcome to MyApp. Please Login with your credentials or Register yourself</h1> <div id='buttons-container'> <button id= "button" data-bind="click: buttonClick, ojComponent: { component: 'ojButton', label: 'Login' }"> <button id= "button" data-bind="click: buttonClick, ojComponent: { component: 'ojButton', label: 'Register' }"> </div id='load_Component'> <div data-bind='component: "my-component"'></div> </div> </div> </div> </div> 注册。

UITableViewCell

答案 6 :(得分:1)

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

答案 7 :(得分:0)

您需要在storyboard中提供正确的可重用标识符,您在注册collectionViewCell时会在代码中给出。

这是代码。

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ClctnVC", for: indexPath)as! ClctnVC
    return cell            
}

答案 8 :(得分:0)

如果您使用的是故事板而不是xib,请执行以下步骤。

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

Prototype cell Attribute panel

  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错误。

答案 9 :(得分:0)

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

答案 10 :(得分:0)

快速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)

答案 11 :(得分:0)

以防万一,如果您正在使用故事板,请在“属性检查器”->“标识符”字段的正确位置设置collectionView标识符。不在“恢复ID”中的类名称下。

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

答案 12 :(得分:0)

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

答案 13 :(得分:0)

如果你曾经尝试解决另一个问题的解决方案不起作用但代码是正确的语法,正确的插座 UI。

您应该检查您的 tableview 或 collectionview,然后检查您是否可能忘记设置委托“tableview.delegate = self 或 collectionview.delegate = self”

collectionview.delegate = self
collectionview.dataSource = self

就我而言,只有您在单元格中设计集合重叠集合。

enter image description here

谢谢。

答案 14 :(得分:-1)

如果您是按代码创建的,则必须创建自定义UICollectionViewCell,然后初始化UICollectionView,并使用loadView设置视图UICollectionView你创造。如果您在viewDidload()中创建,则无效。此外,您还可以拖动UICollectionViewController,这样可以节省大量时间。