2011-08-31 71 views
0

我有一个plist中:的setObject多维字典

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

(不包括内存管理)

回答

1

这个怎么样:

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

当您从您的plist文件initWithContentsOfFile,只有根字典是可变的。子字典都是不可变的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"]; 
+0

我可以用你的建议来改变子字典:[[plistItems objectForKey:@“1”] setObject:stringTemp forKey:@“a”];或[plistItems setValue:stringTemp forKeyPath:@“1.a”];那些都很棒。谢谢!子字典是可变的,只是在我的问题中使用了NSMutableDictionary分配。 – Cephi