我的程序中有这个简单的循环:
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无关,它只是代码。为什么我会收到此错误?
答案 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:
。