保存包含自定义类对象的NSMutableArray的内容
问题描述:
我有一个自定义类“Bookmark”,其中包含NSString
。我使用NSMutableArray
来存储此类的实例,从而制作一个书签列表,我使用UITableViewCell
原型在UITableView
中显示。保存包含自定义类对象的NSMutableArray的内容
有人请给出一些关于如何将NSMutableArray
中的实例保存到文件(也可能是如何加载它们的示例)的建议/示例。我找不到任何我搜索过的例子。我试过将数组转换为NSData
,并使用NSKeyedArchiver
没有成功。我也尝试转换为NSArray
,但无法使其正常工作。
在自定义类中,我实现了encodeWithCode
和initWithCoder
。
我需要在应用程序关闭前保存并且我想在应用程序启动时加载列表。
我卡住了... :(
编辑:在Ageektrapped的要求,这里的代码片段:
我的书签类的实现内部:
- (void) encodeWithCoder: (NSCoder *) encoder
{
[encoder encodeObject:self.address forKey:@"Address"];
}
- (id) initWithCoder: (NSCoder *) decoder
{
self = [super init];
if (self != nil)
{
self.address = [decoder decodeObjectForKey: @"Address"];
}
return self;
}
在我的MasterViewController中
self.bookmarks
是一个包含书签对象的NSMutableArray
(当下面的代码被调用时,存在l东一个书签阵列中的一个条目)。
NSString *docFolder = [NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory,NSUserDomainMask,YES) lastObject];
NSString *filename = [docFolder stringByAppendingPathComponent:@"data.plist"];
NSLog(@"File : %@", filename);
NSLog(@"Bookmarks : %d", self.bookmarks.count);
NSData *data = [NSKeyedArchiver archivedDataWithRootObject: self.bookmarks ];
if ([data writeToFile: filename atomically: YES])
{
NSLog(@"Successful write");
} else {
NSLog(@"Failed write");
}
答
我终于弄清楚我的问题是什么。 由于我在iPhone设备上进行调试,某些文件夹不可写。我使用的代码是要求一个位置在这样的区域(NSDocumentationDirectory
):
终于找到=> How can I get a writable path on the iPhone?我明白我的问题,并得到了它的工作之后。
我需要什么做的是取代:
NSString *docFolder = [NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory,NSUserDomainMask,YES) lastObject];
NSString *filename = [docFolder stringByAppendingPathComponent:@"data.plist"];
有:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES);
NSString *libFolder = [paths objectAtIndex: 0];
NSString *filename = [libFolder stringByAppendingPathComponent: @"data.archive"];
我也改变了这些行(必须与一致。例如)来自:
NSData *data = [NSKeyedArchiver archivedDataWithRootObject: self.bookmarks ];
if ([data writeToFile: filename atomically: YES])
{
NSLog(@"Successful write");
} else {
NSLog(@"Failed write");
}
到:
BOOL success = [NSKeyedArchiver archiveRootObject: self.bookmarks toFile: filename];
if (success)
{
NSLog(@"Successful write");
} else {
NSLog(@"Failed write");
}
。
的代码读取该文件到NSMutableArray
在应用程序启动是:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES);
NSString *libFolder = [paths objectAtIndex: 0];
NSString *filename = [libFolder stringByAppendingPathComponent: @"data.archive"];
self.bookmarks = [NSKeyedUnarchiver unarchiveObjectWithFile: filename];
,你能否告诉我们encodeWithCoder:和的initWithCoder:方法实现?并将该数组保存到文件的代码? – ageektrapped 2013-04-06 11:25:56