8

当我尝试通过 UINib 的 instantiateWithOwner 方法从 xib 文件加载自定义 UITableViewCell 时,出现以下错误。我已经尝试了在这里可以找到的所有其他解决方案,但都没有运气。问题似乎是当 UINib 打开 xib 文件时,它使用超类 UITableViewCell 而不是我的自定义类 ContentPackCell。我附上了一个来自 Interface Builder 的屏幕截图,显示了我将 xib 与我的类关联的位置以及关联标识符的位置。必须有一些其他的步骤,我错过了。

错误:

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UITableViewCell 0x6b87220> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key descriptionLabel.'

代码(类似于 Apple 的示例 AdvancedTableViewCells 项目):

ContentPackCell *cell = (ContentPackCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    [self.cellNib instantiateWithOwner:self options:nil];
    cell = tmpCell;
    self.tmpCell = nil;
}

在 IB 中设置自定义类

在 IB 中设置标识符


更新:

设置文件所有者的类

4

7 回答 7

37

确保 nib 中的 File's Owner 设置为 NSObject,并确保没有连接到 File's Owner 的插座。

于 2012-11-09T00:20:49.333 回答
5

检查笔尖中的所有元素,确保它们没有引用不再存在的东西。右键单击它们以查看指向什么。里面肯定会有东西。

于 2012-08-31T12:33:40.967 回答
2

看起来您已将 nib 中的 UILabel 与代码中不再存在的 IBOutlet 链接(descriptionLabel)。

所以再次检查你的 nib 文件。我也多次遇到此错误,这就是我的解决方案。

于 2012-08-31T12:14:21.267 回答
1

在我的情况下,问题是通过检查可编译源列表中是否存在 .m 来解决的。

如果您为自定义表格单元格(或 Interface Builder 所需的任何其他内容)重命名、移动或添加新源,您应该将它们添加到 Project -> Targets -> -> Build Phases -> Compile Sources。

如果您有多个目标 - 检查所有目标。在我的项目中,有一个聚合类型的活动目标(使用自定义 IPA 构建脚本),我认为这是问题的根源,因为新添加的 *.m 文件错过了应用程序类型目标的编译源列表。

于 2013-02-26T10:16:21.270 回答
1

我遇到了完全相同的错误,并且想知道为什么当我右键单击左侧“对象”中的表格单元格时,我的 .h 文件中的 IBOutlets 没有显示,而只是在文件的所有者处显示。我发现当我在 xib 文件的“视图”中左键单击自定义表格单元格,然后在属性检查器中将其分配给“标识符”处的正确自定义 (tableViewCell) 类时,出口出现在表格单元格中在“对象”。也许这有帮助!

于 2012-12-30T09:48:11.090 回答
0

你有没有试过这样

ContentPackCell *cell = (ContentPackCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
  [self.cellNib instantiateWithOwner:nil options:nil]; //Make owner nil
  cell = tmpCell;
  self.tmpCell = nil;
}

通常当你这样做时,你[[NSBundle mainBundle] loadNibNamed:@"ContentPackCell" owner:nil options:nil];会得到像现在这样的错误。因此,如果您收到“此类不符合键值编码”之类的错误,在这两种情况下,原因是没有为自定义单元格的“文件所有者”设置类。

于 2012-09-03T14:23:15.163 回答
0
static NSString *CellIdentifier = @"CellIdentifierName";
ContentPackCell *cell = (ContentPackCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    [[NSBundle mainBundle] loadNibNamed:@"ContentPackCell" owner:self options:nil] ;
    cell=objCustomCell;
}
于 2012-08-31T12:53:10.093 回答