2012-01-06 12 views
8

Stworzyłem plist z dużą bazą różnych zwierząt (klucze) i dodałem ten plist w moim projekcie. Rodzaj każdego zwierzęcia to NSDictionary. W każdym słowniku znajduje się jeszcze 5 klawiszy - cechy tych zwierząt(). Chciałbym przejść przez każde zwierzę i jeśli pasuję do pewnych cech tego zwierzęcia, umieściłem to zwierzę w innym układzie.Czytanie plist file

Tak, starałem się zrobić kod:

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

Więc objectAtIndex:i jest zwierzęciem i minAge jest jedną z cech jest to. Ale mój kod nie działa. Robię to po raz pierwszy, więc co zrobiłem źle? Dzięki!

UPDATE: Dziękuję, twój plist działa normalnie! Ale nadal nie mogę zrozumieć, dlaczego nie działa mój plist: My plist was looking like this

W każdym razie, dziękuję bardzo! Nie jadłem i nie spałem podczas rozwiązywania tego problemu :) Bardzo mi pomogłeś!

Odpowiedz

21

NSArray wartość zwracana będzie zero, jeśli plik nie może zostać otwarty lub jeśli zawartość pliku może można sparsować w tablicę.

Podejrzewam, że problemem jest to, czego potrzebujesz, aby umieścić zawartość w NSDictionary zamiast NSArray

NSDictionary *theDict = [NSDictionary dictionaryWithContentsOfFile:plistFile]; 

Edit.Further na moją odpowiedź

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


    } 

Jeśli słowniki zwierzęce nie są wewnątrz ze słownika macierzystego lub Array, użyj czegoś podobnego do tego:

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


    } 

Edytuj. 1.

Wypróbuj za pomocą tego pliku plist. Upewnij się, że używasz zwykłego edytora tekstu, aby wkleić go i zapisać jako plik plist

Edycja.2. Zaktualizowałem teraz mój plist, aby pasował do twojego. Chociaż drugi działał. Czułem, że bardziej sensowne byłoby to, że używamy tego samego.

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

Również tutaj jest kolejny przykład pokazujący jak porównać wartość logiczną i numer razem

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

Dziękuję markhunte! Tak, tablica zwraca zero w konsoli. Wypróbowałem twój kod, ale również nie działa. Może mam problemy z moim plikiem plist? – Cosinus

+0

Po prostu wstawiłem przykładową paczkę w mojej odpowiedzi. Wypróbuj to. – markhunte

+0

Wow, działa idealnie! Dziękuję bardzo !Proszę sprawdzić moją główną wiadomość :) – Cosinus

0

Zamiast poniższej linii

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

wypróbuj poniższe

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

Yees, dzięki! Już to naprawiłem. Ale niestety, to nie działa. Myślę, że mój problem spowodowany jest czymś innym. – Cosinus