2013-04-28 17 views
23

Sto cercando di leggere plist che contiene gammaCome leggere Array da 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> 

quando provo a leggere valueForKey: @ "keyarray1", ottengo valore nullo. Ho provato a leggere come una stringa e nessun dado array inutile.

My Code

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

Potresti mostrarci il tuo codice completo che legge il plist? – Undo

+0

Posso leggere key1 e key2 ma non leggere array. – ram2013

+0

inviare una schermata di ur plist – Naveen

risposta

63

Prima di tutto Controllare il plist assomiglia:

enter image description here

Ora scrivere righe seguenti in cui si accede tua plist

Oggetto C:

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

Ecco il colpo completo dello schermo (con l'uscita di registro) del mio finestra di lavoro:

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

Risposta ben spiegata !! –

3

cui è memorizzato il plist? È nel pacchetto di app? In tal caso, probabilmente si desidera utilizzare [[NSBundle mainBundle] pathForResource:@"values" ofType:@"plist"] per ottenere il percorso, anziché il codice di codifica @"values.plist".

Dopo aver individuato correttamente il percorso, è possibile ottenere l'array dal dizionario senza problemi, con qualcosa come [values objectForKey:@"keyarray"].

Nota finale: c'è una differenza tra objectForKey: e valueForKey:. Attualmente stai utilizzando valueForkey: che fa parte di NSKeyValueCoding, un protocollo a cui NSDictionary si conforma. È necessario utilizzare objectForKey: (o accessori sintattici per lo zucchero, ad esempio dictionary[@"key"]), poiché sono i modi appropriati per accedere a un valore da un dizionario.

+0

Ho provato a usare 'objectforkey' ma non serve. Ottengo il conteggio come 0. – ram2013

+0

Cosa succede se si 'NSLog (@" valori:% @ ", valori);'? Qualcosa viene stampato, o vedi "(null)"? – zadr

+0

+1 per la nota finale – rptwsthi

3

Puoi provare a seguire il codice?

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

mi sono seguente output nel registro: -

arrayValues = (
    keyitem1, 
    keyitem2 
) 
-1

Prova questo

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

Questo è il modo sbagliato per trovare il percorso di un elemento all'interno del pacchetto di app. Non dare per scontato che sarà un pacchetto piatto, in pratica. Inoltre, non si dovrebbe usare 'valueForKey:' quando si accede ai valori da NSDictionary. – zadr

+0

cosa devo usare quando accedo ai valori di NSDictionary? – Ravindhiran

+0

'-objectForKey:'. Vedere la mia risposta a @ ram2013 in questa stessa domanda: http://stackoverflow.com/a/16269368/162361 – zadr

5

So che questa domanda è troppo vecchia e mi piacerebbe solo aggiungere ulteriori informazioni per chi la incontra di recente.

Nel mio caso ho creato un plist come array (il valore di plist predefinito è Dictionary con il tasto "Root").

enter image description here

poi il xml assomiglia a questo:

enter image description here

Sul mio controller di vista ho inizializzare direttamente l'Array invece di inizializzazione del dizionario quindi ottenere oggetti per la chiave "Root":

enter image description here

Nota: Volevo solo aggiungere questa informazione poiché vedo solo l'inizializzazione del dizionario, quindi l'oggetto per le chiavi. Spero che ti aiuti ragazzi.