iPhone объекты из NSDictionary PList - PullRequest
       13

iPhone объекты из NSDictionary PList

4 голосов
/ 16 января 2010

в моем приложении есть раздел, куда я загружаю из сохраненного списка, в котором есть 2 вложенных словаря, как это:

<?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>1</key>
    <dict>
        <key>color</key>
        <string>yellow</string>
        <key>lang</key>
        <string>US</string>
        <key>name</key>
        <string>Peter</string>
        <key>uid</key>
        <string>1</string>
    </dict>
    <key>2</key>
    <dict>
        <key>color</key>
        <string>blue</string>
        <key>lang</key>
        <string>US</string>
        <key>name</key>
        <string>Josh</string>
        <key>uid</key>
        <string>2</string>
    </dict>
    <key>3</key>
    <dict>
        <key>color</key>
        <string>red</string>
        <key>lang</key>
        <string>DE</string>
        <key>name</key>
        <string>Susan</string>
        <key>uid</key>
        <string>3</string>
    </dict>
</dict>
</plist>

Теперь я хочу получить доступ к строке как внешнему словарю из ключа 2, значение для цвета внутреннего ключа (синий) Я попытался сделать 2 цикла, и это работает для внешнего словаря, но я не могу получить доступ к внутреннему

NSMutableDictionary *savedData = [NSMutableDictionary dictionaryWithContentsOfFile:path]; // This contains all data from plist

for (int x=0; x<[savedData count]; x++) {
    NSString *itemNumber = [NSString stringWithFormat:@"%d", x+1];

    //This prints out the correct inner dictionary
    NSLog(@"item#%@: %@",itemNumber,[savedData objectForKey:itemNumber]);


    for (NSDictionary *dict in [savedData objectForKey:itemNumber]) {
        //prints out color, lang, uid, but no key-value pairs 
        NSLog(@"dict: %@",dict);
    }
}

Я хотел бы знать, как получить прямой доступ к парам ключ-значение во внутреннем словаре, может кто-нибудь дать мне толчок в правильном направлении, пожалуйста?

Ответы [ 3 ]

3 голосов
/ 16 января 2010

Как насчет этого:

NSString *blueColorString = [[savedData objectForKey:@"2"] objectForKey:@"color"];

Хитрость заключается в том, чтобы вкладывать вызовы метода, первый [saveData objectForKey: 2] возвращает вам внутренний объект словаря, для которого вы можете снова вызвать метод. Надеюсь, что это работает как задумано.

Лучший, Robin

1 голос
/ 17 января 2010

NSLog(@"%@", [savedData valueForKeyPath:@"1.color"]);

желтый

0 голосов
/ 16 января 2010

Обычно вы используете valueForKey:, когда ваши ключи являются строками:

// to get to "blue" string
NSLog(@"outer key '2', inner key 'color' = %@",[[savedData valueForKey:@"2"] valueForKey:@"color"]);

// all inner key / value pairs
for (NSString *key in savedData) {
    NSDictionary *innerDict = [savedData valueForKey:key];

    for (NSString *innerKey in innerDict) {
        NSLog(@"key %@ value %@",innerKey,[innerDict valueForKey:innerKey]);
    }
}
...