我在XCode上创建了一个plist,它有一些我无法手动插入的值。所以我想在开发时以编程方式添加这些值。但似乎我只能阅读plist我无法保存App捆绑上的plist,这在运行时是有意义的。当我将分发我的应用程序时,我希望每个人都有这个plist文件,这就是为什么我不保存在文档或缓存上。我怎样才能实现我的目标?
答案 0 :(得分:0)
从http://www.karelia.com/cocoa_legacy/Foundation_Categories/NSFileManager__Get_.m(粘贴在下方),您可以使用在此处找到的-(NSString *) pathFromUserLibraryPath:(NSString *)inSubPath
方法在用户的个人库中构建路径。
例如,NSString *editedPlist = [self pathFromUserLibraryPath:@"my.plist"];
会在用户的库中为您提供修改过的plist的名称(即使该plist尚未存在)。
你如何阅读/写它是根据你有什么样的plist,但你可以把它读成字典:
NSMutableDictionary *thePlist= [[NSMutableDictionary alloc] initWithContentsOfFile:editedPlist ];
如果您无法阅读,例如[thePlist count] == 0
轻松检测到,那么您将调用相同的initWithContentsOfFile:
初始化程序,并在程序包中找到模板的路径,但您会写plist到editedPlist
路径,因此它出现在用户目录中。
以下是我参考的实用方法:
/*
NSFileManager: Get the path within the user's Library directory
Original Source: <http://cocoa.karelia.com/Foundation_Categories/NSFileManager__Get_.m>
(See copyright notice at <http://cocoa.karelia.com>)
*/
/*" Return the path in the user library path of the given sub-path. In other words, if given inSubPath is "foo", the path returned will be /Users/myUser/Library/foo
"*/
- (NSString *) pathFromUserLibraryPath:(NSString *)inSubPath
{
NSArray *domains = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES);
NSString *baseDir= [domains objectAtIndex:0];
NSString *result = [baseDir stringByAppendingPathComponent:inSubPath];
return result;
}
答案 1 :(得分:0)
我建议编写的代码在开始时检查文档目录中的plist。如果它在那里,请将其读入内存。
如果在文档目录中找不到该文件,请从应用程序包中读取该文件。然后从内存中删除使用它的代码,并将更改后的版本写入文档目录。
请记住,即使您将可变对象写入文件,您从plist文件中读取的所有对象都将被读取为不可变对象。您必须编写代码,以便为您要更改的任何内容创建可变副本。 (并且如果你有像字典数组这样的复杂结构,那么必须实现一个可变深度副本,而字典数组又包含字符串数组。)