类不符合键值编码规范

68

我知道这个错误的含义,但我真的很苦恼,需要有人帮助我:

2010-09-21 15:03:11.562 Stocks[5605:207] *** Terminating app due to uncaught 
exception 'NSUnknownKeyException', reason: '[<NSObject 0x499fb20> 
setValue:forUndefinedKey:]: this class is not key value coding-compliant 
for the key actionText.'

以下是我的代码:

AlertCell.h

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>


@interface AlertCell : UITableViewCell {
    IBOutlet UILabel *actionText;
}

@property (retain, nonatomic) UILabel *actionText;

@end

并且

AlertCell.m

@implementation AlertCell
@synthesize actionText;
   
- (void)dealloc {
    [actionText release];
    [super dealloc];
}
   
@end

问题就发生在这里:

- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    static NSString *CellIdentifier = @"Cell";
    
    AlertCell *cell = 
      (AlertCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    
    if (cell == nil) {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"AlertCell" 
                                                         owner:nil 
                                                       options:nil];
        for (id oneObject in nib) {
            if ([oneObject isKindOfClass:[UITableViewCell class]]) {
                cell = (AlertCell *)oneObject;
                break;
            }
        }
    }    
    
    
    cell.actionText.text = [arrayAlert objectAtIndex:indexPath.row];
    return cell;
}

在这一行:

NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"AlertCell" 
                                             owner:nil 
                                           options:nil];

正如被问到的那样,这是我的TableViewCOntroller的标题:

#import <UIKit/UIKit.h>


@interface AlertesViewController : UITableViewController {
    NSMutableArray *arrayAlert;
}

你可以查看我的XIB文件(以XML格式):http://pastebin.com/FDVzLYZu

@end

有人能帮我吗?非常感谢!


你能展示一下你的UITableViewController的头文件吗?我怀疑你将错误的对象设置为AlertCell的“File's Owner”。 - falconcreek
8个回答

102

3
这是在众多误导性答案中唯一启迪人心的回答,谢谢! :D - Isaac
1
我按照那个精确的教程做,遇到了同样的问题。这个修复方法对我有效,非常感谢 :) - Tom Redman
12
为了表述清晰:在IB中,“文件所有者”将指代显示自定义单元格的ViewController。通常您会在那里将界面对象链接到插座中,但不适用于自定义单元格!在属性检查器中,选择自定义单元格,并将“自定义类”属性设置为具有插座的类名。然后将接口对象附加到类文件的.h文件上,而不是文件所有者。 - software evolved
请接受这个作为正确答案!第二段有两行就足以解决这个问题了!顺便说一下,@theprof,非常感谢! - Suran
亲爱的教授,我是来自未来的我。我只是想让您知道,您为我节省了大量时间。谢谢您。 - michael
显示剩余3条评论

84
有几种解决方法可供选择-我会让您决定哪个是最合适的。
失败的原因是因为所有者被传递为nil。您在IB中将actionText outlet绑定到文件的所有者,但加载nib时,所有者为nil。我猜测在使用nil所有者的情况下,NSObject在后台使用,这就是为什么您会收到键/值错误的原因。
我之前建议将单元格作为所有者传递也会失败,因为我不知道Nib是如何构建的;单元格为nil,因为您尚未创建它(并且dequeue返回nil,因此即使将单元格作为所有者传递,仍然基本上是传递nil)。
两个选项:
1. 在-cellForRowAtIndexPath:(NSIndexPath *)indexPath实现中实例化一个新单元格,并将该新单元格作为所有者传递(但我猜想这对您来说不是最佳解决方案)
2. 或者,我建议这是更好的解决方案,更改nib文件中actionText的绑定为Alert Cell而不是文件的所有者(您有文件的所有者和Alert Cell-将UILabel绑定到Alert Cell的actionText outlet,而不是当前的文件所有者),我怀疑这正是您想要的。考虑到这一点,文件所有者可以再次成为NSObject。
-------保留原始答案,因为文件所有者类也是此错误的常见原因-------
它表明您已在InterfaceBuilder中“实例化”了AlertCell,并且您正在将某些内容绑定到actiontext,但是该类未设置为AlertCell,而是仍然是NSObject?
查看Interface Builder中该对象工具箱中标识选项卡上的类文本框。类应为AlertCell,但我猜测它仍然设置为NSObject。
另外,如果从Objective C的期望/约定角度出发,我建议您执行几个额外的操作:
1. 根据类命名您的文件(大写文件名的第一个字符)。
2. 为您的类名称添加前缀;两个大写字符,通常是您的缩写(例如,我会将其命名为DWAlertCell)。

我已经更新了我的原始答案,因为它允许格式化 - 通过复制您的nib XML并创建适当的类,我可以通过将单元格实例化为所有者或将操作文本输出绑定到Alert Cell而使其工作,而不是文件的所有者。 - dannywartnaby
谢谢你的回答,它帮助了我。我也遇到了同样的问题。你的答案帮助我解决了错误。 - pankaj
Dannywartnaby,感谢您发布答案并坚持下去。我有一个完全相同的问题,即我将自定义单元格中的标签绑定到文件所有者而不是nib中的单元格,并且我使用了owner:nil而不是owner:cell。现在我的表格视图中有数据出现了。 - Jazzmine
我认为下面得到更高投票的答案比被接受的答案更正确。 - software evolved
古老的问题,但在Swift中仍然适用。 ;) 当我将IB子视图拖动到我的UITableViewCell的Swift子类中创建IBOutlet时,我收到了这个错误。默认情况下,IB将其绑定到文件所有者而不是单元格,导致它在运行时尝试查找我的属性在NSObject上,从而导致相同的错误。当然,解决方法是像你指出的那样将其设置为单元格。 :) - qix
显示剩余7条评论

7

我曾经遇到过同样的问题,但是在任何文件中都找不到所提及的变量/元素。我按照以下步骤进行操作。

环境:Xcode 6

  • 进入Xib文件,右键单击(Ctrl+鼠标单击)每个UI元素以查看其关联内容。
  • 在其引用输出部分,您将能够找到错误的关联内容。
  • 删除该关联内容。
  • 清理解决方案和构建文件夹。
  • 重置模拟器。
  • 重新构建和运行项目。

5

检查从nib/StoryBoard文件引用的UIControl出口属性名称


4

确保选择要添加自定义类的单元格,而不是选择文件所有者添加自定义类。选择单元格后,在右上方添加自定义类。 如果您已经这样做了,在进行任何更改之前,请先取消出口连接,然后从文件所有者中删除自定义类,并将类添加到单元格视图中。


3
也许这能帮到你: 当你选择文件的所有者时,可以使用Identity Inspector; 当你选择对象内部的单元格时,可以使用Identity Inspector来查看自定义单元格名称。

2

经过2个小时的工作,我才意识到我忘了做什么

@synthesize tableView = _tableView;

希望这能有所帮助。
马里奥

0
#import <UIKit/UIKit.h>

@interface ReceptionDetailCell : UITableViewCell

@property (weak, nonatomic) IBOutlet UILabel *productName;

@property (weak, nonatomic) IBOutlet UILabel *billType;

@property (weak, nonatomic) IBOutlet UILabel *bookTime;

@property (weak, nonatomic) IBOutlet UILabel *doctorName;

@property (weak, nonatomic) IBOutlet UILabel *downBillManName;




@end

请检查单元格代码和故事板设置,确保它们都存在,可能您已经更改了它们的名称。

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