2012-04-03 63 views
8

我使用的是自定义UITableViewCell。当我尝试运行我的代码,我得到这个异常堆栈和我无法理解问题的根源:无效的笔尖注册标识符((null)) - 笔尖必须包含一个顶级

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' 

请注意,我没有使用故事板。

编辑:

这是我的相关代码根据断点引起的问题:

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

为了调试的目的,我建议将代码行分成两部分。将UINib对象加载到变量中,并在尝试注册之前测试它是否成功。 – 2012-04-03 16:14:23

回答

1

我不是很确定你正在尝试在您提供的代码来完成。你将在tableView:cellForRowAtIndexPath:中卸载你的笔尖。您可以使用下面的代码:

- (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并将其分配给单元而不是循环来完成此操作,并且这也适用。但是,如果有一天苹果决定在nibArray中加入其他东西,for循环可以保护你免受这种情况的侵害。

+0

如果您使用IOS6,请尝试使用dequeueReusableCellWithIdentifier:forIndexPath:并且很高兴。验证单元是否为零不再需要 – seufagner 2013-09-05 14:33:10

0

这可能不是OP的问题的答案,但我对于不同的解决方案有同样的错误,所以我会回答这个问题,以便来到后来的Google员工。

有一个UITableViewCell在我的厦门国际银行(实际上,我自己的子类) - 所以我不明白为什么它不工作。

的关键似乎是:

当你已经创建了一个XIB文件与一个UITableViewCell或子类(例如,如果你从图书馆上一个UITableViewCell拖动右下角),界面生成器会显示一个选项“检查器”选项卡的“表格视图单元格”部分下。

我通常用于创建UIView并将其类型更改为我的UITableViewCell子类,所以我从未注意到该选项。

这是,你需要输入识别码(以及在你的registerNib:withReuseIdentifer:调用)。

更令我沮丧的是,当遇到这种情况时,它并没有崩溃EVERY时间,只有第一次。奇怪的。

29

另一种解决方案:

我的UITableViewCell,但在我的厦门国际银行有一个额外的对象,这是我放错了标签。

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

enter image description here

+0

是的,我有一个Button只是坐在那里 – 2013-05-02 16:59:33

+0

谢谢,这个答案只是结束了大约三个小时的看似无望的调试。我以为我已经从IB生成的文件中删除了默认视图,但事实证明我只隐藏了它。 – 2014-01-28 10:03:29

+1

哇。这是一个简单的例子,它可以帮助您节省数小时的调试时间。谢谢。 – holydevil 2014-06-20 03:13:02

0

在我来说,我设定的名称类的属性(如为:@property(强,非原子)IBOutlet中的UILabel *类)在tableviewcell,这给上面提到的错误,然后将其命名“班”是不是客观的c类型,改变(class = classabc)解决上述问题。

相关问题