objective-c data-structures nsdictionary

objective c - NSDictionary setValue: forKey:-obteniendo "esta clase no es un valor clave que cumple con la codificación de la clave"



objective-c data-structures (2)

En primer lugar, está utilizando -setValue:forKey: en un diccionario cuando debería usar -setObject:forKey: En segundo lugar, intentas mutar un NSDictionary , que es un objeto inmutable, en lugar de un NSMutableDictionary , que funcionaría. Si cambia a usar -setObject:forKey: probablemente obtendrá una excepción que le -setObject:forKey: que el diccionario es inmutable. Cambia la inicialización de tu article a

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

y debería funcionar

Tengo este simple bucle en mi programa:

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]; }

Está utilizando la biblioteca ElementParser para hacer un diccionario de valores de una fuente RSS (hay otros valores además del "título" que he omitido). self.articles es un NSMutableArray que almacena todos los diccionarios en el documento RSS.

Al final, esto debería producir una variedad de diccionarios, con cada diccionario que contiene la información que necesito sobre el elemento en cualquier índice de matriz. Cuando intento usar setValue:forKey: me da la

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

error. Esto no tiene nada que ver con Interface Builder, todo es solo código. ¿Por qué recibo este error?


Esta:

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

significa que el diccionario es inmutable . Si desea cambiar su contenido, cree un diccionario mutable en su lugar:

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

Alternativamente, puedes crear tu diccionario como:

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

y suelta el lanzamiento al final de ese método.

Además, el método canónico para agregar / reemplazar objetos en un diccionario (mutable) es -setObject:forKey: A menos que esté familiarizado con la codificación de clave-valor , le sugiero que no use -valueForKey: y -setValue:forKey: