Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何在objective-c中使用我的类和PList?_Iphone_Objective C_Xcode - Fatal编程技术网

Iphone 如何在objective-c中使用我的类和PList?

Iphone 如何在objective-c中使用我的类和PList?,iphone,objective-c,xcode,Iphone,Objective C,Xcode,我有一个类来处理项目中的数据,现在我需要存储数据。 我想用Plist,但我有点不确定如何开始。 我的类非常简单-6条数据,平面(没有层次结构) 我希望我的应用程序开始时没有数据,那么我是否可以假设,一旦用户创建了他们的第一条数据,我就应该以编程方式创建PList?(也就是说,在分发之前不要在“支持文件”中创建.plist文件?) 然后,当应用程序下次启动时,读取数据并创建类实例的NSMUtableArray数组?您可以做两件事: 使用默认值: objectForKey方法是要用于存储类的方法。

我有一个类来处理项目中的数据,现在我需要存储数据。 我想用Plist,但我有点不确定如何开始。 我的类非常简单-6条数据,平面(没有层次结构)

我希望我的应用程序开始时没有数据,那么我是否可以假设,一旦用户创建了他们的第一条数据,我就应该以编程方式创建PList?(也就是说,在分发之前不要在“支持文件”中创建.plist文件?)

然后,当应用程序下次启动时,读取数据并创建类实例的NSMUtableArray数组?

您可以做两件事:

使用默认值:

objectForKey方法是要用于存储类的方法。但是,正如评论中所指出的,这实际上不应该用于存储大量的用户数据;这是保存首选项的最佳方法

为了存储更多数据,您可能需要查看核心数据。它更复杂,但应该更适合您的需要。以下是关于它的教程:


这两种方法似乎都不适合您的简单应用程序,但我把这个答案留给您,因为它提供了将数据保存到iPhone的替代方法。

要创建属性列表,您只需使用适当的类型(即支持属性列表格式的类型:NSData、NSString、NSDictionary、NSNumber、NSDate、NSArray),将它们存储在单个容器中,并告诉包含对象将自身写入文件。要读取数据,可以使用路径初始化相同的类型。例如:

// writing some data to a property list
NSString *somePath = ... // replace ... with the path where you want to store the plist file
NSMutableDictionary myDict = [NSMutableDictionary dictionary];
[myDict setObject:@"Caleb" forKey:@"name"];
[myDict setObject:[NSNumber numberWithInt:240] forKey:@"cholesterolOrIQ"];
[myDict writeToFile:somePath atomically:YES];

// reading the file again
NSDictionary *readDict = [NSDictionary dictionaryWithContentsOfFile:somePath];

最简单的方法是简单地将NSArray或NSDictionary保存到磁盘。Caleb的回答在这里非常详细,所以我不再重复,只是说您可能需要将不兼容的对象(如NSColor)转换为属性列表对象(如NSData)。每次保存或加载数据时,这取决于您自己

NSKeyedArchiver和NSKeyedUnarchiver为您提供了对流程的更多控制,但工作方式基本相同。提供(或获取)包含数据的plist兼容根对象(通常是NSDictionary)。我建议创建一个包含您的数据结构以及任意数字(您的应用程序的内部版本号是一个不错的选择)的字典,以用作版本指示器。这样,如果您更新了数据模型,您就可以轻松确定是否需要执行任何操作来将其转换为新版本


如果要将自己的对象放入数据文件,请查看NSCoding。该协议提供了两种使用NSKeyedArchiver和NSKeyedNarchiver保存和恢复数据的方法。如果您的数据模型不仅仅由几个简单的字符串和数字组成,那么这是迄今为止最简单的方法,因为您处理的是自己的本机对象。在您的例子中,您将让您的数据类实现NSCoding,并使用NSKeyedArchiver和NSKeyedUnarchiver方法对六个实例变量进行编码。当需要保存或加载时,将类的实例打包到NSDictionary(以及上面提到的版本号)中,并调用NSKeyedArchiver的
archiveRootObject:toFile:
。您的save-an-load方法只处理您自己的数据对象,这使事情变得简单。这里要注意的常见陷阱是,您的自定义数据对象是否包含其他自定义对象。这很好,但您必须确保要保存的每个对象都有自己的NSCODE实现。

谢谢。用户将通过向列表中添加项,然后为每个项设置属性来创建类的多个实例,因此我需要存储一个数组或字典。如果这样做有效,您应该单击复选标记。它告诉其他SO用户此问题已得到满意的回答。:)还有问题!不确定如何在Plist中读取/写入类实例数组。nsUserDefault用于应用程序设置。在其中存储用户数据是不可伸缩的。NSUserDefault用于存储首选项,而不是用户数据。如果您的需求很简单,我也会远离核心数据。这无疑会增加项目的复杂性,如果plist能够完成这项工作,那么可能不需要这些复杂性。这似乎很简单,但如果我使用的是“int”“BOOL”“UIColor”之类的类型,那么会怎么样?另外,它们都在NSMutableArray中?我需要使用NSCoding、归档等吗?从阅读和阅读开始。对于非属性列表类型(如UIColor),可以使用支持plists的类型(如NSString、NSNumber或NSData)对其进行编码,也可以使用其他格式。归档是一个很好的方法。我发现这个链接是迄今为止最简单的描述:我用最少的编码使它工作起来。谢谢你的帮助。