NSDictionary setValue: forKey: - получение "этот класс не соответствует значению ключа, соответствующему кодированию для ключа" - PullRequest
23 голосов
/ 06 ноября 2011

В моей программе есть простой цикл:

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"

ошибка. Это не имеет никакого отношения к Интерфейсному Разработчику, все это только для кода. Почему я получаю эту ошибку?

Ответы [ 2 ]

87 голосов
/ 06 ноября 2011

Во-первых, вы используете -setValue:forKey: в словаре, когда вы должны использовать -setObject:forKey:. Во-вторых, вы пытаетесь изменить NSDictionary, который является неизменным объектом, вместо NSMutableDictionary, который будет работать. Если вы переключитесь на -setObject:forKey:, вы, вероятно, получите исключение, сообщающее, что словарь является неизменным. Переключите инициализацию article на

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

и должно работать.

9 голосов
/ 06 ноября 2011

Это:

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

означает, что словарь неизменен . Если вы хотите изменить его содержимое, вместо этого создайте изменяемый словарь:

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

Кроме того, вы можете создать свой словарь как:

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

и сбросьте выпуск в конце этого метода.

Кроме того, канонический метод добавления / замены объектов в (изменяемом) словаре - -setObject:forKey:. Если вы не знакомы с кодированием значения ключа , я предлагаю вам не использовать -valueForKey: и -setValue:forKey:.

...