【问题标题】:NSDictionary setValue:forKey: -- getting "this class is not key value coding-compliant for the key"NSDictionary setValue:forKey: -- 得到“这个类不是键值编码兼容的键”
【发布时间】: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'

标签: objective-c data-structures nsdictionary


【解决方案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:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-13
    • 2014-03-26
    • 2017-08-07
    • 1970-01-01
    • 2015-05-08
    • 2015-09-13
    • 1970-01-01
    • 2013-10-11
    相关资源
    最近更新 更多