2010-08-19 7 views
1

J'ai un NSArray contenant plusieurs NSDictionaries.Problème NSArray/NSDictionary imbriqué

J'ai un NSString contenant une chaîne d'ID. Ce que j'essaye de faire est de parcourir les NSDictionaries jusqu'à ce que je trouve l'objet qui correspond à NSString. Ensuite, je veux retourner l'ensemble NSDictionary.

Je suis assez nouveau pour le développement de l'iPhone, donc je manque probablement quelque chose d'évident ... Merci d'avance. :)

Edition, voici le fichier .plist qui obtient sauvé:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<array> 
    <dict> 
     <key>date</key> 
     <string>2011/05/20</string> 
     <key>id</key> 
     <string>1282007740</string> 
     <key>name</key> 
     <string>Test item name</string> 
     <key>niceDate</key> 
     <string>May 20, 2011</string> 
    </dict> 
    <dict> 
     <key>date</key> 
     <string>2010/08/15</string> 
     <key>id</key> 
     <string>1282075925</string> 
     <key>name</key> 
     <string>Test. Nothing to see here.</string> 
     <key>niceDate</key> 
     <string>Aug 15, 2010</string> 
    </dict> 
</array> 
</plist> 

Disons que mon NSString est "1282075925". Je veux obtenir le dictionnaire avec la clé d'identification qui correspond.

+0

Plus d'info. Du code, peut-être? Quelles sont les clés du dictionnaire? – jtbandes

+0

Désolé, je l'ai mis à jour avec une représentation du tableau (sous forme de plist). –

+0

Pouvez-vous donner un exemple de ce que le NSString que vous recherchez est? Plus précisément, recherchez-vous une «clé» ou une «valeur»? c'est-à-dire que vous recherchez 'nom' ou 'nom de l'élément de test' – Akusete

Répondre

3

Ce code doit faire ce que vous voulez - à la fin, dict sera l'un des points à l'NSDictionary vous êtes recherche, ou ce sera nil s'il n'y avait pas de dictionnaire correspondant.

// (These are assumed to exist) 
NSArray *dictionaries; 
NSString *idToFind; 



NSDictionary *dict = nil; 
for (NSDictionary *aDict in dictionaries) { 
    if ([[aDict objectForKey:@"id"] isEqualToString:idToFind]) { 
     dict = aDict; 
     break; 
    } 
} 
+0

+1 pour le style. Mais va-t-il lancer une erreur 'selector non supporté' si la valeur d'un champ 'id' est un tableau ou un autre type en dehors de NSString? – Akusete

+1

C'est un bon point. Si le plist est créé et maintenu par vous, il est discutable si cela vaut la peine d'aller à l'effort de codage défensif pour ce genre de problèmes. En ce qui concerne les données statiques, je ne mets généralement pas ces sortes de contrôles défensifs, puisque je préfère un code concis (ou plus précis, lisible). Si je travaille avec d'autres codeurs, ou si le plist peut être modifié par quelqu'un d'autre, je le ferai d'habitude. C'est un appel de jugement. –

+0

Je ne m'inquiète pas que ce soit un type autre que NSString. J'ai essayé votre solution, car elle est particulièrement simple et élégante. Malheureusement, il ne correspondra pas à la chaîne du dictionnaire pour une raison quelconque. J'ai mis quelques NSLogs pour le déboguer, mais je n'arrive pas à comprendre où ça va mal. Les valeurs que je branche devraient correspondre, et la routine qui a créé le plist est l'insertion d'un NSString, donc ce n'est pas un problème de type ... –

2

Si vous recherchez @ « 12345 », avec une clé de @ « id »

for (NSDictionary* dictionary in array1) { 
    id value = [dictionary valueForKey:@"id"]; 
    if ([value isKindOfClass:[NSString class]]) { 
     NSString* string = (NSString*) value; 
     if ([string isEqualToString:@"12345"]) { 
      return dictionary; 
     } 
    } 
} 
return nil;