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)