2011-10-08 131 views
0

我在网站上发现了几个与有类似问题的人有关的问题,但我仍然无法解决我的问题。这是事情:无法写入plist文件

我正在制作一个包含两个plist文件的iOS应用程序。当用户第一次打开应用程序时,应用程序负责将这两个文件移动到Documents目录。我知道这段代码有效,因为我随后可以从Documents目录路径中的每个文件中读取。但是,由于明显的未知原因,我无法写信给他们中的任何人。下面是我用它来写第一plist文件中的代码:

+ (void)insertNewElementWith:(NSArray *)objects andKeys:(NSArray *)keys { 
    NSString *filePath = [self returnPathForFirstPlistFile]; 
    NSMutableDictionary *contentOfFirstPlistFile = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath]; 
    NSDictionary *dictionary = [[NSDictionary alloc] initWithObjects:objects forKeys:keys]; 
    [contentOfFirstPlistFile setObject:dictionary forKey:[NSNumber numberWithInt:[contentOfFirstPlistFile count]]]; 
    [contentOfFirstPlistFile writeToFile:filePath atomically:YES]; 
    [dictionary release]; 
} 

returnPathForFirstPlistFile确实工作,因为contentOfFirstPlistFile包含{ }而非null。然而,任何人都可以向我解释为什么它会一直返回{ },即使上述方法已被多次调用。

更新

这里是我使用的文件放置在文件目录中的代码。 placePlistsInDocumentsDirectory只有在用户通过应用程序登录时调用,所以这只会发生一次。

+ (NSString *)returnPathForFirstPlistFile { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"First.plist"]; 

    return filePath; 
} 

+ (NSString *)returnPathForSecondPlistFile { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSLog(@"%@", [paths objectAtIndex:0]); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"Second.plist"]; 

    return filePath; 
} 

+ (void)placePlistsInDocumentsDirectory { 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSString *firstPlistPath = [self returnPathForFirstPlistFile]; 
    NSString *secondPlistPath = [self returnPathForSecondPlistFile]; 

    if (![fileManager fileExistsAtPath:firstPlistPath]) { 
     NSError *error; 
     NSString *bundle = [[NSBundle mainBundle] pathForResource:@"First" ofType:@"plist"]; 
     [fileManager copyItemAtPath:bundle toPath:firstPlistPath error:&error]; 
    } 

    if (![fileManager fileExistsAtPath:secondPlistPath]) { 
     NSError *error; 
     NSString *bundle = [[NSBundle mainBundle] pathForResource:@"Second" ofType:@"plist"]; 
     [fileManager copyItemAtPath:bundle toPath:secondPlistPath error:&error]; 
    } 
} 

回答

2
[NSNumber numberWithInt:[contentOfFirstPlistFile count]] 

给你一个NSNumber对象。这不是字典的有效键,关键必须是NSString。使用

[NSString stringWithFormat:@"%d",[contentOfFirstPlistFile count]] 

取而代之。但是,如果您在字典中使用数字作为键,为什么不使用数组?

我试图自己重现这个问题,我可以管理它的唯一方法是使用没有字典作为其根对象的plist。这返回了一个不是零的字典,但不允许任何修改。这不会被写回到文件中。看看你之前的一些问题,你之前使用的是基于数组的plist,所以这可能是问题所在。

+0

谢谢,但仍然无法正常工作。当将一个BOOL变量应用到'writeToFile'行时,即使我已经用NSString替换了NSNumber,它也会返回负值。我也尝试过使用数组,但这也不起作用。 – wstr

+0

如果您在添加“dictionary”之前和之后登录'contentOfFirstPlistFile',您会看到什么? – jrturton

+0

之前的空字典和内容之后的字典。 – wstr