自定义类NSObject不符合键值编码

时间:2013-01-05 20:59:10

标签: objective-c nsobject key-value-coding kvc

  

可能重复:
  Why is my object not key value coding-compliant?

我有一个字典,我想将键/值添加到自定义类,但我总是得到错误,该类不符合KVC,但Apple文档声明它应该是。

我的代码:

ContactObject.h:

@interface ContactObject : NSObject
     + (ContactObject *)testAdding;
@end

ContactObject.m:

@implementation ContactObject

- (id)init {
    self = [super init];
    if (self) {
        // customize

    }

    return self;

}

+ (ContactObject *)testAdding
{
    // create object
    ContactObject *theReturnObject = [[ContactObject alloc] init];

    [theReturnObject setValue:@"Berlin" forKey:@"city"];
    [theReturnObject setValue:@"Germany" forKey:@"state"];

    return theReturnObject;

}

@end

我想我错过了一些非常愚蠢的东西:)

请,任何帮助表示赞赏......

问候, 马蒂亚斯

4 个答案:

答案 0 :(得分:5)

实际上符合KVC标准:

  

如何使属性KVC兼容取决于该属性是属性,一对一关系还是多对多关系。对于属性和一对一关系,类必须按给定的优先顺序实现以下至少一项(键指的是属性键):

  1. 该类具有名为key的声明属性。
  2. 它实现名为key的访问器方法,如果属性是可变的,则setKey:。 (如果属性是Boolean属性,则getter访问器方法的格式为isKey。)
  3. 它声明了key_key形式的实例变量。
  4. 我没有看到这三个中的任何一个被实现。您需要至少具有通过KVC设置的属性,默认的NSObject实现能够通过setValue:forKey:设置属性,但您必须声明它们。

答案 1 :(得分:2)

您需要声明将使用的每个属性:

@interface ContactObject : NSObject

@property (nonatomic,copy, readwrite) NSString* city;
@property (nonatomic, copy, readwrite) NSString* state;

+ (ContactObject *)testAdding;

@end

或使用NSMutableDictionary对象。

例如:

NSMutableDictionary* dict= [NSMutableDictionary new];
[dict setObject: @"Berlin" forKey: @"city"];
[dict setObject: @"Germany" forKey: @"state"];

答案 2 :(得分:1)

您需要实际声明/实现属性。键值编码并不意味着每个NSObject都自动成为键/值字典。

在这种情况下,您需要声明:

@property (nonatomic, readwrite, copy) NSString* city;
@property (nonatomic, readwrite, copy) NSString* state;

@interface声明中。

答案 3 :(得分:1)

ObjC在某些方面是动态的,但就类中的存储而言,它并不是真正的动态。如果您希望ContactObject符合某些键的KVC,则中的那些键需要存在于中。 The KVC Guide有这样的说法:

  

对于属性或一对一关系的属性,这个   要求你的班级:

     
      
  • 实施名为-<key>-is<Key>的方法,或者拥有一个实例   变量<key>_<key>。虽然关键名称经常以a开头   小写字母,KVC还支持以。开头的键名   大写字母,例如URL。

  •   
  • 如果属性是可变的,那么它也应该实现-set<Key>:。   您的-set<Key>:方法的实现不应该执行   验证

  •   

最简单的方法是将所需的键声明为属性:

@property (copy, nonatomic) NSString * city;
@property (copy, nonatomic) NSString * state;

你也可以自己声明一个ivar并实现访问器,但通常没有充分的理由这样做 - 声明的属性会好好照顾你。