2

可能重复:
为什么我的对象不符合键值编码?

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

我的代码:

联系对象.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

4 回答 4

5

实际上要符合 KVC:

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

  1. 该类有一个名为 的声明属性key
  2. 它实现了名为 key 的访问器方法,如果属性是可变的,则setKey:. (如果属性是Boolean属性,则 getter 访问器方法的格式为isKey。)
  3. key它声明了一个形式为or的实例变量_key

我没有看到这三个中的任何一个实现了。您至少需要有您尝试通过 KVC 设置的属性,默认 NSObject 实现能够通过设置属性,setValue:forKey:但您必须声明它们。

于 2013-01-05T21:05:55.883 回答
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"];
于 2013-01-05T21:05:47.767 回答
1

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

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

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

在你的@interface声明中。

于 2013-01-05T21:05:05.753 回答
1

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

对于属性或一对一关系的属性,这要求您的类:

  • 实现一个名为-<key>,的方法-is<Key>,或者有一个实例变量<key>or _<key>。尽管键名经常以小写字母开头,但 KVC 也支持以大写字母开头的键名,例如 URL。

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

实现这一点的最简单方法是将所需的键声明为属性:

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

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

于 2013-01-05T21:06:20.810 回答