NSDictionary setValue:forKey: - 获取“此类不是密钥值编码兼容的密钥”

时间:2011-11-05 22:43:04

标签: objective-c data-structures nsdictionary

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

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提要中创建值的字典(除了“title”之外还有其他值,我省略了)。 self.articles是一个NSMutableArray,它将所有字典存储在RSS文档中。

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

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

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

2 个答案:

答案 0 :(得分:85)

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

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

它应该有用。

答案 1 :(得分:9)

此:

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: