2012-01-06 15 views
8

Creé plist con base grande de diferentes animales (claves) y agregué este plist en mi proyecto. El tipo de cada animal es NSDiccionario. En cada diccionario hay 5 claves más: características de estos animales(). Me gustaría revisar cada animal y si coincido con ciertas características de este animal, pongo este animal en otra matriz.Leyendo plist file

tanto, he intentado hacer un código:

NSArray *newArray = [[NSArray alloc]initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"animals" ofType:@"plist"]];  

for (int i = 0;[newArray objectAtIndex:i];i++)  
{  
     if ([[newArray objectAtIndex:i]objectForKey:@"minAge"] == [NSNumber numberWithInt:3]) 
     {    
       [array addObject:[[newArray objectAtIndex:i]objectForKey:@"name"]];     
     } 
} 

Así objectAtIndex:i es un animal y minAge es una de sus características. Pero mi código no funciona. Lo hago por primera vez, entonces ¿qué he hecho mal? ¡Gracias!

ACTUALIZACIÓN: ¡Gracias, tu lista funciona normalmente! Pero todavía no puedo entender por qué no funciona el mío plist: My plist was looking like this

De todos modos, ¡muchas gracias! No comí ni dormí mientras resolvía este problema :) ¡Me ayudaste mucho!

Respuesta

21

NSArray El valor de retorno será nula si el archivo no se puede abrir o si el contenido del archivo puede no se analiza en una matriz.

Sospecho que el problema es que necesita para poner el contenido en un NSDictionary en lugar de un Edit.Further NSArray

NSDictionary *theDict = [NSDictionary dictionaryWithContentsOfFile:plistFile]; 

a mi respuesta

NSMutableArray *mutableArray =[[NSMutableArray alloc] initWithObjects:nil]; 
NSDictionary *mainDictionary = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"animals" ofType:@"plist"]]; 

    //--get parent dictionary/Array named animals which holds the animals dictionary items 
    NSDictionary *parentDictionary = [mainDictionary objectForKey:@"animals"]; 


    //---enumerate through the dictionary objects inside the parentDictionary 
    NSEnumerator *enumerator = [parentDictionary objectEnumerator]; 
    id value; 

    while ((value = [enumerator nextObject])) { 
     if ([[value valueForKey:@"minAge"] isEqualToNumber:[NSNumber numberWithInt:3]]) 
     {    

      [mutableArray addObject:[value valueForKey:@"name"]];     
     } 


    } 

Si los diccionarios animales no están en el interior de un diccionario padre o array, usar algo como esto

NSMutableArray *mutableArray =[[NSMutableArray alloc] initWithObjects:nil]; 

    NSDictionary *mainDictionary = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"animals" ofType:@"plist"]]; 




    //---enumerate through the dictionary objects 
    NSEnumerator *enumerator = [mainDictionary objectEnumerator]; 
    id value; 

    while ((value = [enumerator nextObject])) { 
     if ([[value valueForKey:@"minAge"] isEqualToNumber:[NSNumber numberWithInt:3]]) 
     {    

      [mutableArray addObject:[value valueForKey:@"name"]];     
     } 


    } 

Editar. 1.

Pruébalo con este plist. Asegúrese de utilizar un editor de texto sin formato para pegarlo y guardarlo como un archivo plist

Edit.2. He actualizado mi plist para que coincida con el tuyo. Aunque el otro funcionó. Sentí que tendría más sentido que estamos usando lo mismo.

<?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"> 
<dict> 
    <key>Whale</key> 
    <dict> 
     <key>name</key> 
     <string>Whale</string> 
     <key>isMale</key> 
     <true/> 
     <key>color</key> 
     <string>blue</string> 
     <key>maxAge</key> 
     <integer>8</integer> 
     <key>minAge</key> 
     <integer>3</integer> 
    </dict> 
    <key>Dolphin</key> 
    <dict> 
     <key>maxAge</key> 
     <integer>20</integer> 
     <key>name</key> 
     <string>Dolphin</string> 
     <key>isMale</key> 
     <false/> 
     <key>color</key> 
     <string>blue</string> 
     <key>minAge</key> 
     <integer>15</integer> 
    </dict> 
</dict> 
</plist> 

Además, aquí es otro ejemplo que muestra cómo comparar el booleano y el número de juntas

NSMutableArray *theAnimalMatched =[[NSMutableArray alloc] initWithObjects:nil]; 


    NSDictionary *mainDictionary = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"data1" ofType:@"plist"]]; 



    //---enumerate through the dictionary objects inside the rootDictionary 
    NSEnumerator *enumerator = [mainDictionary objectEnumerator]; 
    id returnValue; 

while ((returnValue = [enumerator nextObject])) { 

     if ([[returnValue valueForKey:@"isMale" ] boolValue] && [[returnValue valueForKey:@"minAge"] isEqualToNumber:[NSNumber numberWithInt:3]] && [[returnValue valueForKey:@"color"] isEqualToString:@"blue"] ) 
     { 

     [theAnimalMatched addObject:[returnValue valueForKey:@"name"]];     
    } 


} 
+0

Gracias markhunte! Sí, la matriz devuelve nil en la consola. Probé tu código pero tampoco funciona. Tal vez tengo problemas con mi archivo plist? – Cosinus

+0

Acabo de poner un ejemplo plist en mi respuesta. Pruébalo con eso. – markhunte

+0

¡Guau, funciona perfectamente! Muchas gracias !Por favor, revisa mi mensaje principal :) – Cosinus

0

En lugar de la siguiente línea

if ([[newArray objectAtIndex:i]objectForKey:@"minAge"] == [NSNumber numberWithInt:3]) 

pruebe lo siguiente

if ([[[newArray objectAtIndex:i]objectForKey:@"minAge"] isEqualToNumber:[NSNumber numberWithInt:3]]) 
+0

Yees, gracias! Ya lo arregle. Pero desafortunadamente, no funciona. Creo que mi problema es causado por otra cosa. – Cosinus