我正在使用自定义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];
答案 0 :(得分:30)
另一种解决方案:
我有UITableViewCell,但在我的XIB中有一个额外的对象,一个我错放的标签。
因此请仔细检查您的XIB,以确保左侧的对象表中只有一个对象。
答案 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)解决上述问题。