我有一个字典,我想将键/值添加到自定义类,但我总是得到错误,该类不符合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
我想我错过了一些非常愚蠢的东西:)
请,任何帮助表示赞赏......
问候, 马蒂亚斯
答案 0 :(得分:5)
实际上符合KVC标准:
如何使属性KVC兼容取决于该属性是属性,一对一关系还是多对多关系。对于属性和一对一关系,类必须按给定的优先顺序实现以下至少一项(键指的是属性键):
key
的声明属性。 setKey:
。 (如果属性是Boolean
属性,则getter访问器方法的格式为isKey
。) key
或_key
形式的实例变量。 我没有看到这三个中的任何一个被实现。您需要至少具有通过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并实现访问器,但通常没有充分的理由这样做 - 声明的属性会好好照顾你。