自定义UITableViewCell子类:该类不符合键值编码兼容性。

9

我已经查看了StackOverflow上所有与此相关的问题,并尝试了它们所有可能的解决方案,但我仍然无法弄清楚为什么会出现这个错误:

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

我正在尝试使用nibName:“CustomCell”加载自定义的表视图单元格。它的类被分配为“CustomCell”(与nib名称相同的类名)。它的文件所有者也设置为加载此单元格的类 - “ProductsTableViewControllerWithSearch”。nib中的所有插座都连接到CustomCell.m中的插座。
这是我的代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellClassName = @"CustomCell";
    static NSString *CellIdentifier = @"Custom Items Cell";

    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {

      NSArray *topLevelItems =  [[UINib nibWithNibName:CellClassName bundle:[NSBundle mainBundle]] instantiateWithOwner:self options:nil];
        cell = [topLevelItems objectAtIndex:0];

    }
//... more irrelevant code here
}

请问有人能帮我吗?我已经在这个问题上工作了超过4个小时了。非常感谢!

附注:我正在使用ARC,并且正在开发iOS 5。

这是我的CustomCell.h文件。

#import <UIKit/UIKit.h>

@interface CustomCell : UITableViewCell{
    UILabel *textLabel;
    UILabel *detailTextLabel;
    UIButton *starButton;
}

@property (strong, nonatomic) IBOutlet UILabel *textLabel;
@property (strong, nonatomic) IBOutlet UILabel *detailTextLabel;
@property (strong, nonatomic) IBOutlet UIButton *starButton;

@end

我的CustomCell.m文件里面没有内容。


CustomCell是哪个子类? - fearmint
4个回答

13

如果您将任何不属于该视图的东西链接起来,将会出现此错误。

在这种情况下,解决方案在Interface Builder中实现。

  1. 首先将文件所有者(File's Owner)的身份类别(Identity Class)更改为NSObject。
  2. 取消所有File's Owner中的IBOutlet链接。
  3. 将自定义NIB的Identity Class更改为CustomTableViewCell类的名称。
  4. 在此处链接所有的IBOutlet。

就是这样。


如果您在ViewController代码中直接加载nib并希望能够编写以下代码,则可以使用:MyCustomCell *cell; cell.customTextField.text.delegate = self; 这将适用于您。我认为这比其他当前答案更有意义。 - Evan Anger
9
你的CustomTablecell的UILabels应该连接到UITableViewCell对象,而不是文件所有者。我每次都忘记这一点,不确定为什么会这样。 - user798719
这应该是这里被接受的答案 - 至少解决了我遇到的问题。 - Gereon

9
在Interface Builder中,您需要将单元格的类设置为CustomCell,而CustomCell需要有一个名为title的属性。

此类无法进行键值编码关联到关键字…

通常表示在一个类中找不到某个属性,而Interface Builder试图使用该属性,导致崩溃。

是的,我已经将CustomCell.xib的类设置为CustomCell了...这就是为什么我能够在CustomCell.m中连接所有的UILabel。 - acecapades
1
我不知道。嗯。通常每个“成熟”的视图都有一个标题,但我不知道表格视图单元格何时/在哪里使用它们的标题。 - fearmint
我明白了,声明一个名为“title”的属性解决了它! - acecapades
但是!这并没有解决根本问题。UITableView单元格继承自UIView,如果我没记错的话,UIView没有标题属性。UIViewController有——你的单元格被引用在两个地方,其中一个是作为视图控制器吗? - fearmint
哦,我明白了。我不确定为什么会这样。我只在我的ProductsTableViewController(UITVC子类)的cellForRowAtIndexPath方法中调用我的CustomCell,而不是在任何其他类中调用。 - acecapades
显示剩余3条评论

6
我假设您在运行时从NIB加载单元格时会遇到此错误。(如果是在您编写的某一行代码上出错,请务必删除该行代码!)
进入您自定义单元格的XIB视图,Ctrl + 单击“文件所有者”,然后取消连接名为“title”的任何连接。如果您感到有冲动,请取消所有连接,然后重新连接您想要的内容。看看是否解决了问题。如果没有,我将在这里待几个小时。

1
好的策略——查看是否已经连接了“title”属性。 - fearmint
这在这种情况下几乎总是原因! - lnafziger
是的,该单元格是从NIB运行时加载的。现在它可以工作了,当我在头文件中声明一个名为“title”的属性时。我不知道必须声明一个名为title的属性。谢谢@JoePasq。我在StackOverflow上看到的所有其他与此相关的问题中都没有看到这一点。 - acecapades
2
添加一个 -setTitle: 方法并记录/设置断点以查看设置的标题是什么。 - fearmint
1
我之前遇到了这个错误,因为我缺少了一个实现: '@implementation YourTableCellClass '@end - amay0048
1
Ctrl-Click 原型帮了我很多。我的插座变量名称有一个保留关键字,否则类/等等都是完美的,但我仍然得到错误,可能是因为类无法加载。 - Paul

0

对于我的XCode6.0.1,我清理了项目,一切都运行顺利。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接