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"]];
}
}
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
Po prostu wstawiłem przykładową paczkę w mojej odpowiedzi. Wypróbuj to. – markhunte
Wow, działa idealnie! Dziękuję bardzo !Proszę sprawdzić moją główną wiadomość :) – Cosinus