自定义 UITableViewCell 给我:这个类不符合键值编码

Posted

技术标签:

【中文标题】自定义 UITableViewCell 给我:这个类不符合键值编码【英文标题】:Custom UITableViewCell gives me: this class is not key value coding-compliant 【发布时间】:2012-08-16 10:44:02 【问题描述】:

首先,这个讨论并没有解决我的问题。

Custom UITableViewCell subclass: This class is not a key value coding-compliant

设置:

我在MainViewController 中有一组 Person 对象。 想要在AllContactsViewController 中显示UITableView 中的对象。

问题:

使用默认 UITableViewCell 时,一切都按预期工作。 当我使用我的自定义 TableCell 时,我得到一个错误指向 这个类不符合键值编码。

在我将IB 中的三个outlets 中的任何一个与我的TableCell 类连接后,立即发生此错误。

注意:

TableCell 具有三个属性:name & email 标签 + imageView

希望你能帮忙。

TableCell.h

#import <UIKit/UIKit.h>

@interface TableCell : UITableViewCell

@property (weak, nonatomic) IBOutlet UILabel *nameLabel;
@property (weak, nonatomic) IBOutlet UILabel *emailLabel;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@end

TableCell.m

#import "TableCell.h"

@implementation TableCell
@synthesize nameLabel, imageView, emailLabel;

AllContactsViewController.m

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    static NSString *cellIdent = @"TableCell";

    TableCell *cell = (TableCell *)[tableView dequeueReusableCellWithIdentifier:cellIdent];

    if (cell == nil) 

        NSArray *array = [[NSBundle mainBundle]loadNibNamed:@"TableCell" owner:self options:nil];
        cell = [array objectAtIndex:0];
    

    NSString *firstAndLastnameString =
    [NSString stringWithFormat:@"%@ %@",
     [(NewContact *)[self.allContactsArray objectAtIndex:[indexPath row]] firstName],
     [(NewContact *)[self.allContactsArray objectAtIndex:[indexPath row]] lastName]];

    cell.nameLabel.text = firstAndLastnameString;

    cell.emailLabel.text =
    [(NewContact *)[self.allContactsArray objectAtIndex:[indexPath row]] eMail];

    cell.imageView.image =
    [(NewContact *)[self.allContactsArray objectAtIndex:[indexPath row]] contactPicture];

    return cell;

更新:

也许IB的截图会有所帮助。

添加了完整的 AllContactsViewController.h

#import <UIKit/UIKit.h>
#import "VCDelegate.h"
#import "TableCell.h"

@interface AllContactsViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>

@property (weak, nonatomic) id <VCDelegate>delegate;

@property (weak, nonatomic) IBOutlet UITableView *allContactsTableView;

@property (strong, nonatomic) NSMutableArray *allContactsArray;

@property (assign) int currentArrayIndexNumber;

- (IBAction)closeBtnTapped:(id)sender;

@end

【问题讨论】:

哪个键不符合键值对?给出确切的错误信息。 - 您是否确认 cell = [array objectAtIndex:0] 实际上返回了您的 TableCell 类的实例? 取决于我在 IB 中连接的 outlet。我连接namelabel,应用程序崩溃,我连接imageView,而不是应用程序崩溃。看起来我在TableCell 中声明的所有属性都有问题我确定我得到了TableCell 的实例,否则错误消息必须不同,因为错误指向我在TableCell 中的插座 - 确切错误信息:[&lt;AllContactsViewController 0x7f62ad0&gt; setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key imageView.' 错误信息指向AllContactsViewController!将NSLog(@"class=%@", [cell class]); 添加到您的代码以进行检查。 控制台输出:2012-08-16 14:12:57.553 Contacts+[15330:c07] class=TableCell 看看这个答案***.com/a/13300245/163936 【参考方案1】:

如果你是从文件所有者那里连接出口,你应该做不同的事情:

1 - 将 UITableViewCell 的类定义为您的 TableCell 类:

2 - 连接插座不是来自文件所有者,而是来自对象列表中的 TableCell:

【讨论】:

在 IB (Identity Insp.) 中,我已经将 class 设置为 TableCell。因此,当我 ctrl 单击文件所有者时,我看到了 outlets 我在 TableCell 中声明的@ 嗨 Natan,很遗憾,没有,我去 IB 将 TableViewCELL 设置为我的自定义 class。 CTRL单击cell并连接outlets但同样的错误。我已经编辑了我的原始帖子并添加了屏幕截图。也许有帮助。 转到您的 AllContactsViewController 并检查您是否没有任何插座连接到某物,但实际上插座可能不存在。 我拥有的 AllContactsViewController 中唯一的 IBOutlet 是 UITableView。我已经用整个 AllViewController.h 文件更新了我的原始帖子。 谢谢,连接 TableCell 而不是 File's Owner 的插座也为我解决了这个问题。有理由必须这样做吗?我实际上犯过几次这个错误,所以我想知道为什么 Xcode 不会自动创建 UITableViewCell 子类和 .xib 以便您可以像连接其他 UI 组件一样连接自定义单元格中的新组件界面生成器?【参考方案2】:

一切都在我的项目中正确完成,并且在尝试使用自定义单元格及其属性时仍然收到。这是我如何解决我的问题。

CustomUITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomUITableViewCell" forIndexPath:indexPath];

真正击中我的只是从自定义单元格的“Identity Inspector”中删除 CustomUITableViewCell 类并重新输入它。你会看到变化

    模块值 从目标继承模块

让它们成为自动出现的值...不要尝试继承它或更改继承或模块值...

【讨论】:

实际上,我按照您所说的重新进入了我的单元格的类,它自动检查了从目标框继承模块 - 以前未选中 - 这解决了我的问题。不知道为什么。【参考方案3】:

如果您使用的是 Xcode 6 GM,则 IB 中存在可能导致此错误的错误。我不认为 OP 有这个问题,因为它更明显(你可以在日志中看到“未定义的类 MyXXXCell”)但是因为你像我一样从谷歌得到这个问题,只需尝试在 IB 中输入类名然后再次按回车键,一旦它真正保存在 storyboard/xml 文件中就可以了。

【讨论】:

【参考方案4】:

我遇到了同样的问题,这里或其他讨论中的任何 cmet 都帮助了我...最后我只是做了一个干净的原因,我很确定我做的一切都是正确的,是的...神奇地工作!

【讨论】:

【参考方案5】:

这发生在我刚刚 Git 合并并解决了一些冲突之后。 它搞砸了我的 XCode 项目。

我尝试了整个 ***。起初我以为我的自定义类 .m 文件尚未添加到编译源类列表中。但这是一种情况,但即使添加它,它也给了我同样的问题。

我是如何解决的:

    我保留了 .xib 文件及其支持的自定义类 .m 和 .h 文件的备份。 然后清理项目并尝试通过 XCode 运行应用程序(这可能不起作用) 然后将文件重新添加回 XCode 项目,它就可以工作了。

干杯!

【讨论】:

【参考方案6】:

使用 Xcode 12 时遇到了同样的问题。它只需在 Identity Inspector 上重新键入类即可。好像是个bug。

【讨论】:

以上是关于自定义 UITableViewCell 给我:这个类不符合键值编码的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 xib 文件自动布局宽度自定义 UITableViewCell

来自 NIB 的可扩展自定义 UITableViewCell

自定义 uitableviewcell 中的 Uibuttons

带有 xib 文件和自定义构造函数的自定义 UITableViewCell

编辑单元格时自定义 UITableViewCell 反向缩进

来自 .xib 文件的自定义 UITableViewCell