2013-04-28 7 views
23

Ich versuche plist zu lesen, das Array enthältWie Array von plist iOS lesen

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

wenn ich versuche, ValueForKey zu lesen: @ "keyarray1", bekomme ich null-Wert. Ich habe versucht, als String und Array-Nuss keine Verwendung zu lesen.

My-Code

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

Können Sie uns Ihren vollständigen Code zeigen, der den PLIST liest? – Undo

+0

Ich kann den key1 und key2 lesen, kann aber Array nicht lesen. – ram2013

+0

senden Sie einen Screenshots von ur plist – Naveen

Antwort

63

Zunächst einmal Prüfen Sie die plist wie folgt aussieht:

enter image description here

nun folgenden Zeilen schreiben, wo Sie Ihre plist zugreifen

Objekt C:

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

Dies ist die komplette Screenshot (mit Protokollausgabe) meiner Arbeitsfenster:

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

Gut erklärte Antwort !! –

3

Wo ist der plist gespeichert? Ist es im App-Bundle? Wenn dies der Fall ist, möchten Sie wahrscheinlich [[NSBundle mainBundle] pathForResource:@"values" ofType:@"plist"] verwenden, um den Pfad zu erhalten, statt @"values.plist" fest zu codieren.

Nachdem Sie den Pfad ordnungsgemäß heruntergefahren haben, können Sie das Array ohne Probleme aus dem Wörterbuch abrufen, etwa mit [values objectForKey:@"keyarray"].

Abschließender Hinweis: Es besteht ein Unterschied zwischen objectForKey: und valueForKey:. Sie verwenden derzeit valueForkey:, die Teil von NSKeyValueCoding ist, ein Protokoll, dem NSDictionary zufällig entspricht. Sie sollten stattdessen objectForKey: (oder syntaktische Zuckeraccessoren, d. H. dictionary[@"key"]) verwenden, da dies die richtigen Methoden sind, um auf einen Wert aus einem Wörterbuch zuzugreifen.

+0

Ich habe versucht, 'objectforkeyy' zu verwenden, aber keine Verwendung. Ich bekomme die Anzahl als 0. – ram2013

+0

Was passiert, wenn Sie 'NSLog (@" Werte:% @ ", Werte);'? Wird etwas ausgedruckt oder siehst du "(null)"? – zadr

+0

+1 für die letzte Note – rptwsthi

3

Können Sie folgenden Code versuchen?

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); 

Ich habe folgende Ausgabe in Log: -

arrayValues = (
    keyitem1, 
    keyitem2 
) 
-1

Versuchen Sie diese

+0

Dies ist der falsche Weg, um den Pfad eines Elements innerhalb des App-Bundles zu finden. Gehe nicht davon aus, dass es im Grunde ein flaches Bündel sein wird. Außerdem sollten Sie 'valueForKey:' nicht verwenden, wenn Sie auf Werte von NSDictionary zugreifen. – zadr

+0

Was sollte ich dann verwenden, wenn ich auf Werte von NSDictionary zugreife? – Ravindhiran

+0

'-objectForKey:'. Siehe meine Antwort auf @ Ram2013 in dieser Frage: http://Stackoverflow.com/a/16269368/162361 – zadr

5

Ich weiß, dass diese Frage zu alt ist, und ich möchte nur weitere Informationen für diese Leute hinzufügen, die vor kurzem aufgetreten sind.

In meinem Fall habe ich einen Plist als Array erstellt (Plist Standard ist Dictionary mit Schlüssel "Root").

enter image description here

dann sieht das xml wie folgt aus:

enter image description here

Auf meiner Ansicht-Controller initialisieren ich direkt das Array stattdessen das Wörterbuch dann initialisieren Objekt für Schlüssel "Root" erhalten:

enter image description here

Hinweis: Ich wollte nur diese Info hinzufügen, da ich nur das Dictionary initialisiere und dann das Objekt für Schlüssel abrufe. Ich hoffe, es wird euch helfen.