【发布时间】:2014-05-18 11:42:11
【问题描述】:
我在 XCode 上创建了一个 plist,其中包含一些我无法手动插入的值。所以我想在开发时以编程方式添加这些值。但似乎我只能读取 plist 我无法保存 App 包中的 plist,这在运行时是有意义的。当我分发我的应用程序时,我希望每个人都拥有这个 plist 文件,这就是我不保存的原因在文档或缓存上。我怎样才能实现我想要的?
【问题讨论】:
标签: ios objective-c xcode plist
我在 XCode 上创建了一个 plist,其中包含一些我无法手动插入的值。所以我想在开发时以编程方式添加这些值。但似乎我只能读取 plist 我无法保存 App 包中的 plist,这在运行时是有意义的。当我分发我的应用程序时,我希望每个人都拥有这个 plist 文件,这就是我不保存的原因在文档或缓存上。我怎样才能实现我想要的?
【问题讨论】:
标签: ios objective-c xcode plist
从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;
}
【讨论】:
我的建议是编写代码,在开始时检查文档目录中的 plist。如果存在,将其读入内存。
如果您在文档目录中找不到该文件,请改为从应用程序包中读取该文件。然后从内存中放入使用它的代码,并将更改后的版本写入文档目录。
请记住,您从 plist 文件中读取的所有对象都被读取为不可变对象,即使您将可变对象写入文件中也是如此。您必须编写代码来制作您想要更改的任何内容的可变副本。 (如果你有复杂的结构,比如字典数组又包含字符串数组,则必须实现一个可变的深拷贝。)
【讨论】: