使用 NSCoding 创建用户可编辑的 Plist

Posted

技术标签:

【中文标题】使用 NSCoding 创建用户可编辑的 Plist【英文标题】:USe NSCoding To Create User Editable Plist 【发布时间】:2011-03-23 01:41:11 【问题描述】:

我正在尝试创建一个用户可编辑的 plist,用户可以在其中存储自定义创建的锻炼例程,包括从应用程序包中的另一个 data.plist 引用的字符串。

我假设 NSCoding 是解决此问题的最佳方式。到目前为止,我已将界面设置为导航栏和表格视图。

我希望它默认为空白,用户必须按导航栏右上角的“+”。然后他可以为数组中的条目输入名称,例如胸日或二头肌日。在该数组中,将是字典或当天特定练习的另一个字符串数组,例如卧推或二头肌弯举。

这个 plist 需要是可编辑的,所以它将进入用户文档文件夹而不是应用程序包中。

例子:

顶部数组包括胸部日、背部日、腿部日。在 Chest Day 词典中,包括卧推、拉胸、俯卧撑等。

更新:

添加此方法搜索例程文件;

    -(void)loadData

    if(YES)
    
        NSString* documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        NSString* routineFile = [documentsPath stringByAppendingPathComponent:@"routine.plist"];
        BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:routineFile];
    
    else
    
        //load file
    

【问题讨论】:

你的问题到底是什么? 对不起堂吉诃德。我的问题是我将从哪里开始尝试实现这个可编辑的 plist?我知道如何从 plist 读入表格,但不知道如何从一个没有条目的 plist 开始制作可编辑的 plist 我认为部分困难在于弄清楚您所说的“可编辑 plist”是什么意思。假设您具有适当的读/写权限和所有权,任何 .plist 文件都是可编辑的。不过,值得记住的是,plist 只是一种 storage 格式 - 在编辑数据时,您将在应用程序中使用的是 NSArray、NSDictionary 和 NSString 对象,而不是一个列表。 谢谢谢尔姆。是的,我明白这一点。我需要的是让用户能够编辑 plist 中的内容。因此用户可以重新排列字典中的项目,或者重新排列根数组中的字典。我认为这应该不难实现。 【参考方案1】:

NSCoding 是 NSArchiver、NSKeyedArchiver 等使用的协议,不用于将数组序列化为属性列表。

忘记用户将要编辑属性列表的想法。用户将在您的应用程序中编辑数据——它存储为属性列表这一事实只是一个实现细节。当您的应用程序启动时,您会读取存储在数据文件中的数据。用户编辑它,查看它,等等。稍后,也许在每次编辑之后,也许就在应用程序退出之前,您将数据写回到文件中。既然是属性列表,不用担心更新文件;您已经拥有了所有数据,因此请编写一个全新的属性列表,然后使用该文件替换旧的。

也许我错了,您确实打算让用户使用文本编辑器手动编辑属性列表。这将是一个错误。属性列表是人类可读的,这很好,但是要求您的用户手动编辑您的原始数据文件强烈表明您的应用程序已损坏。您的应用程序的全部目的是为用户跟踪这些信息;如果他们想使用文本编辑器来管理它,他们就不需要您的应用程序。所以,话虽如此,我希望我没有错。 ;-)

【讨论】:

谢谢卡贝尔,是的,我了解存储在 plist 中的数据和 plist 本身之间的区别。你是对的,我没有正确解释 - 我不希望用户编辑 plist,只是存储在其中的数据。我将如何开始这个过程?我似乎无法找到从哪里开始 开始什么流程?您似乎对构建数据的方式有一个非常清晰的想法。当应用程序启动时,您会查找您的数据文件。如果你找到了,你就读一读。如果找不到,则创建一个空的可变数组,以便用户可以开始添加项目。稍后,在应用程序执行一段时间后,数组希望不会为空,因此您将按照 Sherm Pendley 的描述对其进行序列化。更多信息here. 谢谢迦勒。我正在使用我正在实施的一种新方法编辑我的原始帖子,以检查文件是否存在或需要被装箱或加载文件(如果存在)。我在正确的轨道上吗?谢谢。 当然,但您也可以使用 +arrayWithContentsOfFile: 正如@Sherm Pendley 建议的那样。如果文件无法打开或读入数组,则返回 nil。 NSArray *myData = [NSMutableArray arrayWithContentsOfFile:@"mydata"]; if (myData == nil) myData = [NSMutableArray array]; 现在您有了用于填充表格的数组。【参考方案2】:

我不认为我会为此使用 NSCoding - 如果您正在使用的只是标准 plist 对象,如 NSArray、NSDictionary 和 NSString,那么顶部数组的 -writeToFile:atomically: 方法是一种简单的方法工作。

【讨论】:

好吧,我想我认为 NSCoding 是这样做的方法。我想我没有把我的问题说得很清楚。我将从哪里开始尝试实现这个可编辑的 plist?我知道如何从 plist 读入表格,但不知道如何从一个没有条目的 plist 开始制作可编辑的 plist。 NSArray 的 -writeToFile:atomically: 创建一个 plist 格式的文件 - 这是你开始的地方,也是你结束的地方。没有第二步。 :-) 类似地,+arrayWithContentsOfFile: 会读回文件。

以上是关于使用 NSCoding 创建用户可编辑的 Plist的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSCoding 保存 TableView 单元格的重新排序

如何使用 NSCoding 保存结构

从 NSUserDefaults 更改为 NSCoding

无法通过 NSCoding 保存表数据

将 iOS 应用从 NSCoding 转换为 Core Data

Swift,NSCoding 保存类的数组不起作用