【问题标题】:Edit Programmatically plist in the App bundle at development time在开发时以编程方式编辑 App 包中的 plist
【发布时间】:2014-05-18 11:42:11
【问题描述】:

我在 XCode 上创建了一个 plist,其中包含一些我无法手动插入的值。所以我想在开发时以编程方式添加这些值。但似乎我只能读取 plist 我无法保存 App 包中的 plist,这在运行时是有意义的。当我分发我的应用程序时,我希望每个人都拥有这个 plist 文件,这就是我不保存的原因在文档或缓存上。我怎样才能实现我想要的?

【问题讨论】:

    标签: ios objective-c xcode plist


    【解决方案1】:

    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 文件。我想在开发时创建一次,然后将此文件与应用程序一起分发。通过在用户的个人库中创建文件,我猜这是不可能的..
    • 您正在发送混合消息 :) 如果您想创建一次,只需在开发过程中创建它(随您喜欢),并将其作为资源包含在您的应用程序中。您说@gran33 中的链接没有帮助,因为它们在其他地方创建了 plist,但是如果您只需要在不相关的开发时创建它们...在您喜欢的任何地方/无论您喜欢什么地方创建它们,将它们包含在您的项目,作为构建步骤,将它们复制到应用程序包中。
    • 当然.. 我很傻。我认为创建的文件不容易访问。我刚刚在我的桌面文件夹中创建了 plist 文件,然后拖到 XCode 中就完成了! :)
    【解决方案2】:

    我的建议是编写代码,在开始时检查文档目录中的 plist。如果存在,将其读入内存。

    如果您在文档目录中找不到该文件,请改为从应用程序包中读取该文件。然后从内存中放入使用它的代码,并将更改后的版本写入文档目录。

    请记住,您从 plist 文件中读取的所有对象都被读取为不可变对象,即使您将可变对象写入文件中也是如此。您必须编写代码来制作您想要更改的任何内容的可变副本。 (如果你有复杂的结构,比如字典数组又包含字符串数组,则必须实现一个可变的深拷贝。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      • 2015-10-27
      • 1970-01-01
      相关资源
      最近更新 更多