【问题标题】:Custom class NSObject not key value coding compliant [duplicate]自定义类 NSObject 不符合键值编码 [重复]
【发布时间】:2012-12-20 00:36:48
【问题描述】:

可能重复:
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

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

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

您好, 马蒂亚斯

【问题讨论】:

  • 你是什么意思“文档状态应该是”?
  • ContactsObject 不是字典,它是一个类,如果要设置这些值,则需要声明 ivars。
  • 是的,发现检查了,先设置然后操作...谢谢大家...

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


【解决方案1】:

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

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

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

在您的 @interface 声明中。

【讨论】:

  • "不错的尝试,但这些字段并不安全,可能是城市,可能是州,可能是几乎所有内容,这就是我想动态执行此操作的原因..."
  • 如果您需要能够使用任何字符串键,那么您将需要使用 NSMutableDictionary,或者您需要创建一个作为 NSMutableDictionary 的 iVar,然后编写 valueForUndefinedKey: 的实现和 setValue:forUndefinedKey: 将未知集合和获取未知键的操作转发到 NSMutableDictionary。
【解决方案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"];

【讨论】:

  • 不错的尝试,但这些字段并不安全,可能是城市,可能是州,可能几乎是所有内容,这就是我想动态执行此操作的原因...
  • 然后使用 NSMutableDictionary。
【解决方案3】:

实际上要符合 KVC:

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

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

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

【讨论】:

  • 嗯,该死的,我理解这不正确 - 我会再次阅读文档......
【解决方案4】:

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

对于属于属性或一对一关系的属性,此 要求您的班级:

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

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

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

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

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

【讨论】:

  • 这里也是,我的错误,对不起!
猜你喜欢
  • 2011-04-15
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 2012-05-29
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
相关资源
最近更新 更多