2009-12-19 8 views
0

ok j'ai un plist comme celui-ciL'évaluation des éléments dans plist iphone sdk

` 
<dict> 
<key>Rows</key> 
<array> 
    <dict> 
     <key>WireSize</key> 
     <string>16 AWG</string> 
     <key>Children</key> 
     <array> 
      <dict> 
       <key>Cooper 60°C (140°F)</key> 
       <string>0</string> 
      </dict> 
      <dict> 
       <key>Cooper 75°C (167°F)</key> 
       <string>0</string> 
      </dict> 
      <dict> 
       <key>Cooper 90°C (194°F)</key> 
       <string>14</string> 
      </dict> 
      <dict> 
       <key>Aluminum 60°C (140°F)</key> 
       <string>0</string> 
      </dict> 
      <dict> 
       <key>Aluminum 75°C (167°F)</key> 
       <string>0</string> 
      </dict> 
      <dict> 
       <key>Aluminum 90°C (194°F)</key> 
       <string>0</string> 
      </dict> 
     </array> 
    </dict> 
    <dict> 
     <key>WireSize</key> 
     <string>16 AWG</string> 
     <key>Children</key> 
     <array> 
      <dict> 
       <key>Cooper 60°C (140°F)</key> 
       <string>0</string> 
      </dict> 
      <dict> 
       <key>Cooper 75°C (167°F)</key> 
       <string>0</string> 
      </dict> 
      <dict> 
       <key>Cooper 90°C (194°F)</key> 
       <string>14</string> 
      </dict> 
      <dict> 
       <key>Aluminum 60°C (140°F)</key> 
       <string>0</string> 
      </dict> 
      <dict> 
       <key>Aluminum 75°C (167°F)</key> 
       <string>0</string> 
      </dict> 
      <dict> 
       <key>Aluminum 90°C (194°F)</key> 
       <string>0</string> 
      </dict> 
     </array> 
    </dict> 

</array> 

`

et essayé de lire les valeurs de mais pas le succès

J'utilise ce code

enter NSBundle *bundle = [NSBundle mainBundle]; 
NSString *plistPath = [bundle pathForResource:@"Table 310-16" ofType:@"plist"]; 
NSDictionary *dictionary = [[NSDictionary alloc] initWithContentsOfFile:plistPath]; 

for (id key in dictionary) { 
    NSArray *array = [dictionary objectForKey:key]; 
    NSLog(@"key: %@, value: %@", key, [array objectAtIndex:0]); 
} here 

et les résultats sont

key: Rows, value: { 
Children =  (
      { 
     "Cooper 60\U00b0C (140\U00b0F)" = 0; 
    }, 
      { 
     "Cooper 75\U00b0C (167\U00b0F)" = 0; 
    }, 
      { 
     "Cooper 90\U00b0C (194\U00b0F)" = 14; 
    }, 
      { 
     "Aluminum 60\U00b0C (140\U00b0F)" = 0; 
    }, 
      { 
     "Aluminum 75\U00b0C (167\U00b0F)" = 0; 
    }, 
      { 
     "Aluminum 90\U00b0C (194\U00b0F)" = 0; 
    } 
); 
WireSize = "16 AWG"; 

}

mais ne savent toujours pas comment et valeur spécifique, par exemple aluminium 60 ° C (140 ° F) ou ou 16 AWG toute aide serait appresiated

HP

Répondre

0

clés NSDictionary doivent être NSString. Étant donné que l'exemple pour la boucle utilise id key, je parie que vous êtes habitué à un langage comme ruby ​​qui permet aux clés d'être un type d'objet arbitraire. Étant donné que les clés doivent être NSStrings, ce qui suit toujours travailler:

for (NSString *key in dictionary) { 
    NSLog(@"key: %@, value: %@", key, [dictionary objectForKey:key]); 
} 

Vous pouvez passer directement la chaîne. Donc, pour obtenir une valeur spécifique telle que votre exemple:

// Edit: objectForValue: should have been objectForKey: 
NSLog(@"Value for Aluminum 60°C (140°F): %@", [dictionary objectForKey:@"Aluminum 60°C (140°F)"]); 
+1

Les clés NSDictionary peuvent être plus que de simples chaînes NSS, elles doivent simplement être conformes au protocole NSCopying. Aussi, comme cela a été souligné, vous avez probablement voulu dire -valueForKey: au lieu de objectForValue :. –

+0

Brad: C'est correct. D'après les documents Apple: «En général, une clé peut être n'importe quel objet (à condition qu'elle soit conforme au protocole NSCopying - voir ci-dessous), mais notez que lorsque vous utilisez le codage par valeur-clé, la clé doit être une chaîne. Fondamentaux). " –

0

Si vous voulez faire des recherches arbitraires à partir d'une clé donnée, vous aurez simplement besoin d'écrire des méthodes d'aide à itérer votre structure de données plist, ou peut-être un peu plus propre est de créer quelques classes pour encapsuler ces structures de données et créer un arbre de ces classes lorsque l'application démarre.

Il semble également que vous pourriez simplifier un peu la structure des données. quelque chose comme ça peut-être?

<array> 
    <dict> 
     <key>16 AWG</key> 
     <array> 
       <dict> 
         <key>Cooper 60°C (140°F)</key> 
         <string>0</string> 
       </dict> 
       <dict> 
         <key>Cooper 75°C (167°F)</key> 
         <string>0</string> 
       </dict> 
     </array> 
    </dict> 
    <dict> 
     <key>12 AWG</key> 
     <array> 
       <dict> 
         <key>Cooper 60°C (140°F)</key> 
         <string>0</string> 
       </dict> 
       <dict> 
         <key>Cooper 75°C (167°F)</key> 
         <string>0</string> 
       </dict> 
     </array> 
    </dict> 
</array> 

Vous pouvez alors présumer que toutes les clés du tableau de haut niveau de dicts sont des jauges fil et les valeurs de chaque touche sont les options de fil.

+0

merci wkw je quand cet itinéraire a déjà apprécié votre aide – quky

Questions connexes