【问题标题】:Class is not key value coding-compliant [duplicate]类不符合键值编码[重复]
【发布时间】:2011-04-15 05:15:03
【问题描述】:

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

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

@结束

谁能帮帮我?非常感谢!

【问题讨论】:

  • 您能否也显示您的UITableViewController 的头文件?我怀疑您将错误的对象设置为 AlertCell 的“文件所有者”

标签: iphone uitableview key


【解决方案1】:
#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

检查单元代码和情节提要设置,它们是否都存在,也许你已经更改了它们的名称。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,我在任何文件中都找不到提到的变量/元素。我按照以下步骤操作。

    环境:Xcode 6

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

    【讨论】:

      【解决方案3】:

      从 nib/StoryBoard 文件中检查 UIControl 引用 OutLet 属性名称

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          也许有帮助: Indentity Inspector 当你选择了文件的所有者 - UITableViewCell, 当您选择对象内的单元格时您的自定义单元格名称

          【讨论】:

            【解决方案6】:

            2小时后,我意识到我忘了

            @synthesize tableView = _tableView;
            

            希望对你有帮助。

            马里奥

            【讨论】:

              【解决方案7】:

              您的代码可能基于网络教程,例如 http://www.e-string.com/content/custom-uitableviewcells-interface-builderhttp://www.icodeblog.com/2009/05/24/custom-uitableviewcell-using-interface-builder/ 上的教程

              您的问题(我 99% 确定这是您出错的地方,我只是犯了同样的错误)是在界面构建器中,当您应该从单元格视图链接它们时,您从 File's Owner 链接了您的 IBOutlets。这就是您收到错误的原因。

              【讨论】:

              • 这是本主题和其他主题中大量误导性答案中唯一具有启发性的答案。谢谢! :D
              • 我遵循了那个确切的教程并且遇到了确切的问题。这个修复对我有用。非常感谢:)
              • 哇!我已经调试这个问题一段时间了。你的回答终于救了我;)。非常感谢。我以前遇到过这个问题并采取了非常非常极端的措施来解决它,尽管我知道让它工作的方法有点难看。谢谢!!!
              • 只是为了完全清楚这一点:在 IB 中,“文件所有者”将引用将显示自定义单元格的 ViewController。通常你将接口对象链接到那里的插座。不适用于自定义电池!在属性检查器中,选择自定义单元格,并将“自定义类”属性设置为将具有插座的类名。然后将接口对象附加到类文件的 .h 中,而不是文件的所有者。
              • 请接受这个作为正确答案! 2 行的第 2 段足以解决这个问题!顺便说一下@theprof,非常感谢!
              【解决方案8】:

              有几个选项可以解决这个问题 - 我会让你决定哪个是最合适的。

              它失败的原因是因为所有者被传递为 nil。您将 actionText 出口绑定到 IB 中的文件所有者,但是在加载 nib 时,所有者为 nil。我猜想在后台使用 nil 所有者加载时会使用 NSObject,这就是您收到键/值错误的原因。

              我之前的建议以所有者身份传递单元格也会失败,因为我不知道笔尖是如何构造的;单元格为 nil,因为您尚未创建它(并且 dequeue 正在将 nil 传回,因此即使传递单元格,因为所有者本质上仍然在传递 nil)。

              两种选择:

              • 在您的 -cellForRowAtIndexPath:(NSIndexPath *)indexPath 实现中实例化一个新单元格,并将该新单元格作为所有者传递(但我猜这不是您的最佳解决方案)
              • 或者,我建议这是更好的解决方案,将 nib 文件中的 actionText 绑定更改为警报单元而不是文件所有者(您有文件所有者和警报单元 - 将 UILabel 绑定到 actionText警报单元的出口,而不是文件的所有者,这是目前正在做的事情) - 我怀疑这就是你想要的。考虑到这一点,文件的所有者可以再次成为 NSObject。

              -------原始答案保留在下面,因为文件的所有者类也是此错误的常见原因-------

              这表明您已经在 InterfaceBuilder 中“实例化”了一个 AlertCell,并且您正在将某些内容绑定到 actiontext,但该类未设置为 AlertCell,它仍然是 NSObject?

              查看 Interface Builder 中该对象的工具选项板的标识选项卡上的类文本框。该类应该是 AlertCell,但我猜它仍然设置为 NSObject。

              顺便说一句,您可以随意忽略这个建议,但我鼓励您做一些额外的事情,纯粹从 Objective C 期望/约定的角度来看:

              • 以您的班级命名您的文件(文件名的第一个字符大写)。
              • 为您的班级名称添加前缀;两个大写字符,通常是您的首字母缩写(例如,我将其命名为 DWAlertCell)。

              【讨论】:

              • 不幸的是,我认为这不是问题所在。在 IB 中,我可以看到“文件所有者”和“警报单元”的类型设置为“警报单元”。你还有什么想法吗?
              • 抱歉错字错误,我的类文件是大写的!我会尽快纠正它。我会尝试为我的班级名称添加前缀,但我认为这不会解决我当前的问题。
              • 说实话,我确定这是您的 IB 配置 - 我自己已经打过几次了。我建议的其他事情(在不知道更广泛的项目的情况下,这可能不是原因),加载的 nib 的所有者实际上应该是您实例化的单元格:[[NSBundle mainBundle] loadNibNamed:@"AlertCell"所有者:单元格选项:无]。如果没有所有者,我不确定 actionText 出口将绑定到哪里。
              • 即使我将单元格设置为已加载笔尖的所有者,它也失败了:/
              • 你能分享你的笔尖文件吗?问题在于加载您的笔尖,我确信问题在于它在 IB 中的配置方式。
              猜你喜欢
              • 1970-01-01
              • 2012-11-27
              • 1970-01-01
              • 2012-04-26
              • 2012-12-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多