为标识符注册的无效nib((null)) - nib必须只包含一个顶级

时间:2012-04-03 15:39:09

标签: ios objective-c uitableview

我正在使用自定义UITableViewCell。当我尝试运行我的代码时,我得到了这个异常堆栈,我无法理解问题的根源:

terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'invalid nib registered for identifier ((null)) - nib must contain exactly one top level object which must be a UITableViewCell instance'

请注意我没有使用Storyboard。

修改

这是我根据断点导致问题的相关代码:

[tableviewSupport registerNib:[UINib nibWithNibName:@"HotelCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:CustomCellCId];

4 个答案:

答案 0 :(得分:30)

另一种解决方案:

我有UITableViewCell,但在我的XIB中有一个额外的对象,一个我错放的标签。

因此请仔细检查您的XIB,以确保左侧的对象表中只有一个对象。

enter image description here

答案 1 :(得分:1)

我不太确定您在提供的代码中尝试做什么。您将在tableView:cellForRowAtIndexPath:中卸载您的nib。您可以使用以下代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    // Assuming you set a reuse identifier "cellId" in the nib for your table view cell...
    HotelCell *cell = (HotelCell *)[tableView dequeueReusableCellWithIdentifier:@"cellId"];
    if (!cell) {
        // If you didn't get a valid cell reference back, unload a cell from the nib
        NSArray *nibArray = [[NSBundle mainBundle] loadNibNamed:@"HotelCell" owner:nil options:nil];
        for (id obj in nibArray) {
            if ([obj isMemberOfClass:[HotelCell class]]) {
                // Assign cell to obj
                cell = (HotelCell *)obj;
                break;
            }
        }
     }

     return cell;
}

现在,根据您发布的错误,iOS期望数组中有一个对象,因此for循环可能是不必要的。我通过检查[nibArray count] == 1然后抓取objectAtIndex:0并将其分配给单元而不是循环来完成此操作,这也是有效的。但是,如果有一天Apple决定在nibArray中添加其他内容,for循环可以保护您免受此攻击。

答案 2 :(得分:0)

这可能不是OP的问题的答案,但我在不同的解决方案中遇到了同样的错误,所以我会回答这个问题是为了以后的Google员工。

在我的XIB中有一个UITableViewCell(实际上是我自己的子类) - 所以我无法理解为什么它不起作用。

关键似乎是:

当您使用单个UITableViewCell或子类创建XIB文件时(例如,如果您从右下方的库中拖动UITableViewCell),Interface Builder会在“表视图单元格”下显示一个选项“检查员标签部分。

我通常用来创建一个UIView并将其类型更改为我的UITableViewCell子类,所以我从来没有注意到这个选项。

那里 您需要输入标识符(以及registerNib:withReuseIdentifer:来电)。

在遇到这种情况时,对我来说更令人沮丧的是它没有崩溃每次时间,只是第一次。怪异。

答案 3 :(得分:0)

在我的情况下,我在tableviewcell中设置了一个具有名称类的属性(例如:@property(强,非原子)IBOutlet UILabel *类),这给出了上面提到的错误,然后命名" class"不是客观的c类型,更改(class = classabc)解决上述问题。