为标识符注册的无效nib(CELLNAME) - nib必须包含一个必须是UITableViewCell实例的顶级对象

时间:2013-12-07 14:11:42

标签: ios objective-c xcode uitableview

很抱歉这个长标题,但我想通过谷歌搜索清楚地看到它。 此外,这与此处的许多其他类似问题不同,因为它没有指定“空”标识符,而是实际存在的标识符。

基本上,当您尝试使用表视图控制器中的一个单元格导航到另一个视图(无论该视图可能是什么)时,会出现问题。

大多数人在完成“待办事项列表”上的苹果教程后会遇到这个问题,并期望细胞以相同的动作运行,无论其目的如何。 这个问题对于大多数人来说可能过于简单,但对于初学者来说,这很难,我花了大约3个小时。

基本上错误是:

invalid nib registered for identifier (prototypeCell) - nib must contain exactly one top level object which must be a UITableViewCell instance

其中'prototypeCell'将是您的单元格被调用的任何内容。这是在应用程序启动时立即发生的异常。

13 个答案:

答案 0 :(得分:173)

我遇到了与上述相同的问题,但我没有使用故事板,问题只是突然出现。

我发现解决方案是在tableview单元文件中。我添加了一个uibutton,但它被错误地添加到了单元格的边界之外。这意味着它几乎就像是uiview中的额外视图。

一旦我找到它并删除了这个额外的视图,问题就会立即消失。

如果您遇到此错误,请检查uitableviewcell以查看错误添加的额外视图和对象

答案 1 :(得分:24)

simon_smiley的答案向我指出了正确的方向,但需要更多的反复试验才能得到以下解决方案:

问题不仅发生在其他顶级UIView对象上,也发生在手势识别器上。因此,请确保不要在失败的XIB文件中使用任何手势识别器,您可以在代码中设置它们。

例如,您可以在awakeFromNib中按照vahotm在接受的答案评论中的说明进行操作。

答案 2 :(得分:7)

我遇到了同样的问题!在我的情况下,自定义单元格是UIView的子类,而不是UITableViewCell。所以用UITableViewCell替换UIView解决了这个问题!

答案 3 :(得分:5)

同样的问题,因为我将UITapGestureRecognizer拖放到ContentView的子视图上。只需删除它。

答案 4 :(得分:3)

问题是故事板中有多个具有相同名称的单元格。例如,对于单个表视图,存在具有相同标识符的多个单元。在我的情况下,我有三个单元,都被称为'prototypeCell'。

修复实际上非常简单。对于每个单元格,将其命名为一个简单的名称,最后是单元格编号。此单元格号必须与indexPath.row匹配,因此基本上从0开始。

例如:

prototypeCell0
prototypeCell1
prototypeCell2

然后,进入负责控制器的类,找到函数

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

然后替换代码:

static NSString *CellIdentifier = @"PrototypeCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

使用代码:

static NSString *CellIdentifier = @"ListPrototypeCell";
NSString* num = [NSString stringWithFormat:@"%d", indexPath.row];
NSString* actual = [CellIdentifier stringByAppendingString:num];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:actual forIndexPath:indexPath];

其他一切都可以保持不变。此代码基本上获取行号,将其添加到标识符库,使用该字符串从表中获取单元格。因此,如果它响应不同的行号,则返回不同的单元格。

为了澄清,我对问题的全部功能如下:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"ListPrototypeCell";
    NSString* num = [NSString stringWithFormat:@"%d", indexPath.row];

    NSString* actual = [CellIdentifier stringByAppendingString:num];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:actual forIndexPath:indexPath];
    cell.textLabel.text = self.content[indexPath.row];

    return cell;
}

祝你好运!

另外,这是我的第一个答案/问题组合,所以我真的不知道如何处理它,所以如果我做错了什么,请告诉我和/或改变它。 谢谢!

答案 5 :(得分:3)

有时您使用storyboard并在其中包含collectionView和collectionView。之后,您决定简化故事板并将单元格划分为另一个笔尖。您可以从故事板创建空笔尖Ctrl+C - > Ctrl+V进入笔尖。

一切看起来都很好,但是由于未捕获的异常'NSInternalInconsistencyException',你将 终止应用程序,原因:'无效的nib注册为标识符(PrettyCollectionViewCell) - nib必须包含一个必须的顶级对象UICollectionReusableView实例'

Ansver:不要这样做。在我清理笔尖并添加所有元素后,我在故事板中 - 它已修复。

似乎像xCode IB的Bug - 版本7.3.1(7D1014)

答案 6 :(得分:2)

为了googlers,我会提出愚蠢的解决方案......

这是我个人的愚蠢错误 - 当我为我的桌面视图创建一个新的自定义单元格时,我进入了我的项目的顶级目录 - >添加新文件 - >并在 OS X 部分下创建了一个空文件类型,而不是 iOS 部分。

希望大多数人都有上述其他问题,因为它不那么尴尬:P

答案 7 :(得分:1)

就我而言, 我在不同的目标中添加了UITableViewHeaderFooterView子类和XIB,而不是实际目标。

确保它处于运行目标。

enter image description here

答案 8 :(得分:1)

此错误主要是由于错误添加了一些额外的视图。查看.xib文件,检查是否有误添加的多余视图。删除它,它将完美运行。您可以通过this is how it looks

检查是否有不需要的视图

答案 9 :(得分:0)

我有这个问题,终于发现我创建了UITableViewCell Subclass而不是CollectionViewCell子类。那是晚上,我累了,哈哈。修正了它在mng。

答案 10 :(得分:0)

这是一个愚蠢的错误,我有两个导致此错误的表格单元格。删除了另一个解决此问题的“表格视图单元格”。

答案 11 :(得分:0)

我通过在接口构建器中设置类名称以使其与接口构建器中的单元重用标识符(针对该类)相匹配来解决此问题。

注意:我并不是说类和标识符必须相同。我是说他们需要链接相应的视图和支持模型。

答案 12 :(得分:0)

在我的情况下,我在xib内错误地添加了一个额外的ImageView。删除它,一切正常。

enter image description here

相关问题