web-dev-qa-db-ja.com

NSDictionary setValue:forKey:-「このクラスはキーのコーディングに準拠したキー値ではありません」を取得

私のプログラムにはこの単純なループがあります:

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は、RSSドキュメント内のすべての辞書を格納するNSMutableArrayです。

最後に、これにより辞書の配列が生成されます。各辞書には、配列のインデックスにあるアイテムについて必要な情報が含まれています。 setValue:forKey:を使用しようとすると、

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

エラー。これはInterface Builderとは関係なく、すべてコードのみです。このエラーが発生するのはなぜですか?

25
Logan Serman

まず、-setValue:forKey:を使用する必要があるときに、辞書で-setObject:forKey:を使用しています。次に、機能するNSDictionaryではなく、不変オブジェクトであるNSMutableDictionaryを変更しようとしています。 -setObject:forKey:の使用に切り替えると、辞書が不変であることを示す例外が発生する可能性があります。 articleの初期化をに切り替えます

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

そしてそれはうまくいくはずです。

91
Lily Ballard

この:

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

辞書はimmutableであることを意味します。その内容を変更したい場合は、代わりに変更可能な辞書を作成します。

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

または、次のように辞書を作成することもできます。

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

そのメソッドの最後にリリースをドロップします。

また、(可変)ディクショナリでオブジェクトを追加/置換する標準的な方法は-setObject:forKey:です。 Key-Valueコーディング に慣れていない場合は、-valueForKey:および-setValue:forKey:を使用しないことをお勧めします。

9
user557219