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-канала (есть другие значения, кроме "title", которые я пропустил). self.articles
- это NSMutableArray, который хранит все словари в документе RSS.
В конце концов, это должно создать массив словарей, каждый словарь, содержащий информацию, которая мне нужна об элементе, в любом индексе массива. Когда я пытаюсь использовать setValue:forKey:
, он дает мне
this class is not key value coding-compliant for the key "Title"
ошибка. Это не имеет ничего общего с Interface Builder, это всего лишь код. Почему я получаю эту ошибку?
Ответы
Ответ 1
Во-первых, вы используете -setValue:forKey:
в словаре, когда вы должны использовать -setObject:forKey:
. Во-вторых, вы пытаетесь мутировать NSDictionary
, который является неизменным объектом, а не NSMutableDictionary
, который будет работать. Если вы переключитесь на использование -setObject:forKey:
, вы, вероятно, получите исключение, сообщив вам, что словарь неизменен. Переключите инициализацию article
на
NSMutableDictionary *article = [[NSMutableDictionary alloc] init];
и он должен работать.
Ответ 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:
.