Чтение plist файла - PullRequest
       24

Чтение plist файла

9 голосов
/ 06 января 2012

Я создал plist с большой базой разных животных (ключей) и добавил этот plist в свой проект.Тип каждого животного - NSDictionary.В каждом словаре есть еще 5 ключей - характеристики этих животных ().Я хотел бы пройтись по каждому животному, и если я соответствую определенным характеристикам этого животного, я помещаю это животное в другой массив.

Итак, я попытался создать код:

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

Итак, objectAtIndex:i - животное, а minAge - одна из его характеристик.Но мой код не работает.Я делаю это впервые, так что я сделал не так?Спасибо!

ОБНОВЛЕНИЕ: Спасибо, ваш список работает нормально!Но я до сих пор не могу понять, почему не работает мой список: My plist was looking like this

В любом случае, большое спасибо!Я не ел и не спал, пока решал эту проблему :) Вы мне очень помогли!

Ответы [ 2 ]

21 голосов
/ 06 января 2012

NSArray Возвращаемое значение будет равно нулю, если файл не может быть открыт или содержимое файла не может быть проанализировано в массив.

Я подозреваю, что проблемавам нужно поместить содержимое в NSDictionary, а не в NSArray

 NSDictionary *theDict = [NSDictionary dictionaryWithContentsOfFile:plistFile];

Edit. В дополнение к моему ответу

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


    }

Если словари животных не находятся внутри родительского словаря илиМассив, используйте что-то вроде этого

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


    }

Редактировать.1.

Попробуйте это с этим списком.Убедитесь, что вы используете простой текстовый редактор, чтобы вставить его и сохранить как файл plist

Edit.2.Теперь я обновил свой список, чтобы он соответствовал вашему.Хотя другой работал.Я чувствовал, что было бы более разумно, если бы мы использовали одно и то же.

<?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>

Кроме того, вот еще один пример, показывающий, как сравнивать логическое и число вместе

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 голосов
/ 06 января 2012

Вместо следующей строки

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

попробуйте следующее

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