2013-04-28 13 views
23

Próbuję odczytać plist, który zawiera tablicęJak odczytać tablicę z iOS plist

<?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>key1</key> 
<string>value1</string> 
<key>key2</key> 
<string>value2</string> 
<key>keyarray1</key> 
<array> 
    <string>keyitem1</string> 
    <string>keyitem2</string> 
</array> 
</dict> 
</plist> 

gdy próbuję czytać valueForKey: @ „keyarray1”, pojawia się wartość null. Próbowałem odczytywać jako ciąg i tablicę bez użycia.

mój kod

NSDictionary * values=[[NSDictionary alloc] initWithContentsOfFile:@"values.plist"]; 
NSArray *arrayValues=[[NSArray alloc] initWithArray:[values valueForKey:@"keyarray1"]]; 
+0

Czy możesz pokazać nam swój pełny kod, który odczytuje plik plist? – Undo

+0

Mogę odczytać klucz 1 i klucz2, ale nie mogę odczytać tablicy. – ram2013

+0

wyślij zrzuty ekranu ur plist – Naveen

Odpowiedz

63

Przede wszystkim sprawdź swoją plist wygląda następująco:

enter image description here

Teraz napisać następujące linie gdzie łączysz się plist

Objectiv C:

NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Values" ofType:@"plist"]]; 
NSLog(@"dictionary = %@", dictionary); 
NSArray *array = [dictionary objectForKey:@"keyarray1"]; 
NSLog(@"array = %@", array); 

Oto pełna zrzut ekranu (z wyjściem dziennika) z mojego okna pracy:

enter image description here

Swift:

let dictionary = NSDictionary(contentsOfFile: Bundle.main.pathForResource("Values", ofType: "plist")!); 
let array = dictionary?["arrayKey"] as! NSArray 
print("dictionary=", dictionary, "\narray =", array) 

enter image description here

+0

Dobrze wyjaśniona odpowiedź !! –

3

Gdzie jest przechowywany plist? Czy jest w pakiecie aplikacji? Jeśli tak, prawdopodobnie chcesz użyć [[NSBundle mainBundle] pathForResource:@"values" ofType:@"plist"], aby uzyskać ścieżkę, zamiast kodowania twardego @"values.plist".

Po prawidłowym przejściu do ścieżki można bez problemu uzyskać tablicę ze słownika, np. O nazwie [values objectForKey:@"keyarray"].

Ostatnia uwaga: istnieje różnica między objectForKey: i valueForKey:. Aktualnie używasz valueForkey:, który jest częścią NSKeyValueCoding, protokołu, który jest zgodny z NSDictionary. Powinieneś zamiast tego używać objectForKey: (lub syntaktycznych odpowiedników cukru, tj. dictionary[@"key"]), ponieważ są one właściwym sposobem uzyskiwania dostępu do wartości ze słownika.

+0

Próbowałem użyć 'objectforkey', ale bezużyteczne. Otrzymuję liczbę jako 0. – ram2013

+0

Co się stanie, jeśli 'NSLog (@" wartości:% @ ", wartości);'? Czy coś się drukuje, czy widzisz "(null)"? – zadr

+0

+1 za ostatnią notatkę – rptwsthi

3

Czy możesz spróbować użyć kodu?

NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"values" ofType:@"plist"]; 
NSDictionary * values=[[NSDictionary alloc] initWithContentsOfFile:plistPath]; 
NSArray *arrayValues=[[NSArray alloc] initWithArray:[values valueForKey:@"keyarray1"]]; 
NSLog(@"arrayValues = %@",arrayValues); 

mam następujący komunikat w dzienniku: -

arrayValues = (
    keyitem1, 
    keyitem2 
) 
-1

Spróbuj

NSString *path = [[NSBundle mainBundle] bundlePath]; 
NSString *finalPath = [path stringByAppendingPathComponent:@"values.plist"]; 
NSMutableDictionary *dict =[NSMutableDictionary dictionaryWithContentsOfFile:finalPath]; 
NSArray *arr =[dict valueForKey:@"keyarray1"]; 
NSLog(@"%@",arr); 
+0

Jest to niewłaściwy sposób znalezienia ścieżki elementu w pakiecie aplikacji. Nie zakładaj, że to będzie zwykły pakiet. Ponadto nie powinieneś używać 'valueForKey:' podczas uzyskiwania dostępu do wartości z NSDictionary. – zadr

+0

to, co powinienem użyć podczas uzyskiwania dostępu do wartości z NSDictionary? – Ravindhiran

+0

'-objectForKey:'. Zobacz moją odpowiedź na @ ram2013 na to pytanie: http://stackoverflow.com/a/16269368/162361 – zadr

5

Wiem, że to pytanie jest zbyt stary, a ja po prostu lubię dodać więcej informacji na te osoby napotykają niedawno.

W moim przypadku stworzyłem plist jako Array (domyślnie plist to Dictionary with key "Root").

enter image description here

wtedy xml wygląda następująco:

enter image description here

Na mój widok kontrolera zainicjować bezpośrednio Array zamiast inicjowania słownik następnie uzyskać obiekt do klucza "root":

enter image description here

Uwaga: Chciałam tylko dodać te informacje, ponieważ widzę tylko inicjalizację Słownika, a następnie otrzymuję obiekt dla kluczy. Mam nadzieję, że to ci pomoże.