类不符合键值编码

时间:2010-09-21 13:33:51

标签: iphone uitableview key

我知道这个错误的意思,但我真的很挣扎,我需要别人的帮助:

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

任何人都可以帮助我吗?非常感谢!

8 个答案:

答案 0 :(得分:102)

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

上的教程

您的问题(我99%确定这是您绊倒的地方,我只是犯了同样的错误)是在界面构建器中,您应该从文件所有者链接您的IBOutlets时应该从单元格视图链接它们。这就是你得到错误的原因。

答案 1 :(得分:84)

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

它失败的原因是因为所有者被传递为零。您将actionText插座绑定到IB中文件的所有者,但是在加载笔尖时,所有者为零。我猜想在幕后加载Nil所有者时会使用NSObject,这就是你得到键/值错误的原因。

我以前建议将单元格作为所有者传递也会失败,因为我不知道Nib是如何构建的;因为你还没有创建它,所以单元格是零(并且dequeue正在向后传递nil,所以即使传递单元格,因为所有者仍然基本上没有通过nil)。

两个选项:

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

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

它表明你已经在InterfaceBuilder中实例化了一个AlertCell,并且你将某些东西绑定到了actiontext,但是这个类没有设置为AlertCell,它仍然是NSObject?

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

顺便说一句,并且可以随意忽略这个建议,但是我鼓励你做一些额外的事情,纯粹来自 Objective C期望/约定的观点:

  • 在课程后命名您的文件(大写文件名的第一个字符)。
  • 在您的班级名称前加上;两个大写字符,通常是您的姓名缩写(例如,我将其命名为DWAlertCell)。

答案 2 :(得分:7)

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

环境:Xcode 6

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

答案 3 :(得分:5)

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

答案 4 :(得分:4)

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

答案 5 :(得分:3)

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

答案 6 :(得分:2)

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

@synthesize tableView = _tableView;

希望它有所帮助。

马里奥

答案 7 :(得分: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

查看Cell代码和故事板设置,它们是否全部存在,也许您已更改其名称。