NSDictionary setValue:forKey: -- 得到“这个类不是键值编码兼容的键”

Posted

技术标签:

【中文标题】NSDictionary setValue:forKey: -- 得到“这个类不是键值编码兼容的键”【英文标题】:NSDictionary setValue:forKey: -- getting "this class is not key value coding-compliant for the key" 【发布时间】:2011-11-05 22:43:04 【问题描述】:

我的程序中有这个简单的循环:

for (Element *e in items)

    NSDictionary *article = [[NSDictionary alloc] init];
    NSLog([[e selectElement: @"title"] contentsText]);
    [article setValue: [[e selectElement: @"title"] contentsText] forKey: @"Title"];

    [self.articles insertObject: article atIndex: [self.articles count]];
    [article release];

它使用 ElementParser 库从 RSS 提要中创建一个值字典(除了“标题”之外还有其他值,我已经省略了)。 self.articles 是一个 NSMutableArray,用于存储 RSS 文档中的所有字典。

最后,这应该生成一个字典数组,每个字典都包含我需要的关于任何数组索引处的项目的信息。当我尝试使用 setValue:forKey: 它给了我

this class is not key value coding-compliant for the key "Title"

错误。这与 Interface Builder 无关,它只是代码。为什么会出现此错误?

【问题讨论】:

有什么理由不使用-setObject:forKey:,规范的NSMutableDictionary 方法来添加/替换字典中的对象? 当我使用它时,我得到[__NSDictionary0 setObject:forKey:]: unrecognized selector sent to instance 0x4e7efb0' 【参考方案1】:

首先,你在字典上使用了-setValue:forKey:,而你应该使用-setObject:forKey:。其次,你试图改变一个NSDictionary,它是一个不可变的对象,而不是一个可以工作的NSMutableDictionary。如果您切换到使用-setObject:forKey:,您可能会收到一个异常,告诉您字典是不可变的。将您的 article 初始化切换到

NSMutableDictionary *article = [[NSMutableDictionary alloc] init];

它应该可以工作。

【讨论】:

谢谢...当我使用NSMutableDictionary 时,我使用的是NSMutableDictionary *article = [[NSDictionary alloc] init];。忘记更改第二个NSDictionary。德普。谢谢。 你知道为什么在模拟器中,它让我改变 NSDictionary 的键的值。但在我的设备上,我遇到了与 Logan 相同的错误? @prolfe:字典是从哪里来的? [[NSDictionary alloc] init] 返回的字典不应该让你改变它的值。从其他方法返回的字典实际上可能是 NSMutableDictionary,这意味着 -setValue:forKey: 实际上会成功。并且返回字典的任何方法都可能在模拟器和设备上有所不同。不小心尝试更改类型为 NSDictionary 的值是您应该更喜欢 -setObject:forKey: 的原因之一(如果您在 NSDictionary 上使用它会引发编译器错误)。【参考方案2】:

这个:

NSDictionary *article = [[NSDictionary alloc] init];

表示字典是不可变的。如果要更改其内容,请创建一个可变字典:

NSMutableDictionary *article = [[NSMutableDictionary alloc] init];

或者,您可以将字典创建为:

NSDictionary *article = [NSDictionary dictionaryWithObject:[[e selectElement: @"title"] contentsText] forKey:@"Title"];

并在该方法结束时删除版本。

此外,在(可变)字典中添加/替换对象的规范方法是-setObject:forKey:。除非你对Key-Value Coding很熟悉,否则我建议你不要使用-valueForKey:-setValue:forKey:

【讨论】:

以上是关于NSDictionary setValue:forKey: -- 得到“这个类不是键值编码兼容的键”的主要内容,如果未能解决你的问题,请参考以下文章

NSDictionary 的 NSArray 过滤和 NSDictionary

带有 NSArray 的 UITableview 包含 NSDictionary 和 NSDictionary 包含另一个 NSDictionary

NSPredicate (nsdictionary+array+nsdictionary)

NSDictionary 里面的 NSDictionary

过滤其他 NSDictionary 中的 NSDictionary

从 NSDictionary 保存数据到 NSDictionary