2016-12-22 5 views
0

Ich möchte Daten aus der PLIST-Datei meines Projekts abrufen, die sortiert werden sollte. Jetzt sieht mein plist wieAbrufen von Daten aus PLIST in NSDictionary

<?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"> 
<array> 
    <dict> 
     <key>code</key> 
     <string>AF</string> 
     <key>phone_code</key> 
     <string>93</string> 
     <key>name</key> 
     <string>Afghanistan</string> 
    </dict> 
    <dict> 
     <key>code</key> 
     <string>AL</string> 
     <key>phone_code</key> 
     <string>355</string> 
     <key>name</key> 
     <string>Albania</string> 
    </dict> 

und so weiter auf bis zu letzten country.And I-Daten am Holen ähnlichen

NSString* path = [[NSBundle mainBundle] pathForResource:@"CountriesWithPhoneCodes" ofType:@"plist"]; 
    NSArray* a = [NSArray arrayWithContentsOfFile:path]; 
    for (NSDictionary *d in a) 
    { 
     NSString *cdate = [d objectForKey:@"CDate"]; 
     if ([cdate isEqualToString:@"Whatever is currently selected"]) 
     { 
      NSString *text = [d objectForKey:@"Text"]; 
      // do something with text here 
     } 
    } 

    NSDictionary *dict = [[NSDictionary alloc]init]; 
    dict = [self indexKeyedDictionaryFromArray:a]; 

    NSLog(@"This is %@",[[dict allValues]objectAtIndex:0]); 

Der Ausgang ich immer bin, ist

This is { 
    code = AF; 
    name = Afghanistan; 
    "phone_code" = 93; 
} 

aus dem ich Ich kann nicht richtig auf Daten zugreifen. Wie kann ich ein Wörterbuch mit phone_code als Wert und Land als Schlüssel erstellen?

+0

worauf möchten Sie zugreifen? Dies ist { Code = AF; Name = Afghanistan; "Telefoncode" = 93; } –

+0

Es ist ziemlich unklar. 'd' hat keinen Schlüssel' "CDate" '. Sie können ein Prädikat oder 'indexOfObjectPassingTest:' verwenden, um das gewünschte Wörterbuch zu finden. Wenn Sie statt der Verwendung eines Arrays die Unicity für den Ländernamen berücksichtigen, können Sie stattdessen auch den Ländernamen als Schlüssel verwenden und ein Wörterbuch auf oberster Ebene verwenden. – Larme

+0

Was meinen Sie mit "von dem aus ich nicht richtig auf Daten zugreifen kann"? Sie möchten lieber ein Wörterbuch, das nur 'name' und' phone_code' enthält? – dirtydanee

Antwort

1

NSPredicate passt perfekt zu Ihren Bedürfnissen.

NSString *path = [[NSBundle mainBundle] pathForResource:@"CountriesWithPhoneCodes" ofType:@"plist"]; 
NSArray *array = [NSArray arrayWithContentsOfFile:path]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"phone_code = %@", @"String variable containing code"]; 
NSDictionary *countryDictionary = [array filteredArrayWithPredicate:predicate].firstObject; 

Wenn Sie Wörterbuch mit einer solchen Struktur erstellen möchten: {"phone_code":"country_code"}:

NSMutableDictionary *phonesDict = [NSMutableDictionary new]; 
for (NSDictionary *dict in array) { 
    NSString *phoneCode = dict[@"phone_code"]; 
    NSString *countryCode = dict[@"country_code"]; 
    phonesDict[countryCode] = phoneCode; 
} 

Hinweis: Sie dieses Wörterbuch irgendwo gespeichert werden sollte Zugriff auf die Datei auf der Festplatte zu vermeiden.

0
NSDictionary *dictRoot = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"data" ofType:@"plist"]]; 

// Your dictionary contains an array of dictionary 
// Now pull an Array out of it. 
NSArray *arrayList = [NSArray arrayWithArray:[dictRoot objectForKey:@"catlist"]]; 

// Now a loop through Array to fetch single Item from catList which is Dictionary 
[arrayList enumerateObjectsUsingBlock:^(id obj, NSUInteger index, BOOL *stop) { 
// Fetch Single Item 
// Here obj will return a dictionary 
NSLog(@"Category name : %@",[obj valueForKey:@"category_name"]); 
NSLog(@"Category id : %@",[obj valueForKey:@"cid"]); 
}];