web-dev-qa-db-fra.com

NSDictionary setValue: forKey: - obtenir "cette classe n'est pas conforme au codage de la valeur de clé pour la clé"

J'ai cette boucle simple dans mon programme:

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

Il utilise la bibliothèque ElementParser pour créer un dictionnaire de valeurs à partir d'un flux RSS (il y a d'autres valeurs que "title" que j'ai omises). self.articles est un NSMutableArray qui stocke tous les dictionnaires dans le document RSS.

En fin de compte, cela devrait produire un tableau de dictionnaires, chaque dictionnaire contenant les informations dont j'ai besoin sur l'élément à n'importe quel index de tableau. Lorsque j'essaie d'utiliser setValue:forKey: ça me donne le

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

erreur. Cela n'a rien à voir avec Interface Builder, c'est uniquement du code. Pourquoi ai-je cette erreur?

25
Logan Serman

Tout d'abord, vous utilisez -setValue:forKey: dans un dictionnaire alors que vous devriez utiliser -setObject:forKey:. Deuxièmement, vous essayez de muter un NSDictionary, qui est un objet immuable, au lieu d'un NSMutableDictionary, qui fonctionnerait. Si vous passez à l'utilisation de -setObject:forKey: vous obtiendrez probablement une exception vous indiquant que le dictionnaire est immuable. Basculez votre article initialisation sur

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

et ça devrait marcher.

91
Lily Ballard

Ce:

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

signifie que le dictionnaire est immuable . Si vous souhaitez modifier son contenu, créez plutôt un dictionnaire modifiable:

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

Alternativement, vous pouvez créer votre dictionnaire comme:

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

et supprimez la version à la fin de cette méthode.

De plus, la méthode canonique pour ajouter/remplacer des objets dans un dictionnaire (mutable) est -setObject:forKey:. À moins que vous ne soyez familier avec Codage de valeur-clé , je vous suggère de ne pas utiliser -valueForKey: et -setValue:forKey:.

9
user557219