setObject в многомерном словаре - PullRequest
0 голосов
/ 31 августа 2011

У меня есть листинг:

<?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>a</key>
        <string>a1</string>
        <key>b</key>
        <string>b1</string>
    </dict>
    <key>2</key>
    <dict>
        <key>a</key>
        <string>a2</string>
        <key>b</key>
        <string>b2</string>
    </dict>
    <key>3</key>
    <dict>
        <key>a</key>
        <string>a3</string>
        <key>b</key>
        <string>b3</string>
    </dict>
</dict>
</plist>

... с которого я начинаю изменчивый словарь (см. Ниже). Я могу легко ссылаться на строку с помощью вызова вложенного метода:

NSLog(@"%@", [[plistItems objectForKey:@"1"] objectForKey:@"a"]);

Есть ли способ, которым я могу сделать setObect для этого конкретного ключа с помощью подобного вложенного метода, или мне нужно сделать это более длинным способом, как показано?

-(void) writeOneItemInADictionary
{   
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Plist3" ofType:@"plist"];

    NSMutableDictionary *plistItems = [[NSMutableDictionary alloc] initWithContentsOfFile:path];

    //This will return an object for a specific key:
    //NSLog(@"%@", [[plistItems objectForKey:@"1"] objectForKey:@"a"]);

    NSString *stringTemp = [[NSString alloc] initWithString: @"a1 modified"];
    //I want to do something similar with setObject,to modify a1:
    //[[plistItems setObject:stringTemp forKey:@"1"]forKey:@"a"]]; //not correct - does not work

    //Or do I have to do it this longer way?:
    NSMutableDictionary *plistSubItems = [[NSMutableDictionary alloc] init];
    plistSubItems = [plistItems objectForKey:@"1"];
    [plistSubItems setObject:stringTemp forKey:@"a"];
    NSLog(@"plistSubItems: %@", plistSubItems);
    NSLog(@"plistItems %@", plistItems); //longer way works fine
}

(управление памятью не включено)

Ответы [ 2 ]

1 голос
/ 31 августа 2011

Что по этому поводу:

[[plistItems objectForKey:@"1"] setObject:stringTemp forKey:@"a"];
0 голосов
/ 31 августа 2011

Когда вы initWithContentsOfFile из вашего plist-файла, только корневой словарь является изменяемым. Все словари являются неизменными NSDictionary. Так что было бы невозможно написать

[[plistItems objectForKey:@"1"] setObject:stringTemp forKey:@"a"];

Чтобы получить «полный» изменяемый словарь, вы должны использовать NSPropertyListSerialization:

NSData *plistData = [[NSFileManager defaultManager] contentsAtPath:path];
NSError *error = nil;
NSPropertyListFormat format;
NSMutableDictionary *plistItems = (NSMutableDictionary *)[NSPropertyListSerialization
                             propertyListFromData:plistData
                                 mutabilityOption:NSPropertyListMutableContainersAndLeaves
                                           format:&format 
                                 errorDescription:&error];

Вы сможете изменить значения следующим образом:

[plistItems setValue:stringTemp forKeyPath:@"1.a"];
...