我有一个自定义类“书签”,其中包含NSString
。我使用NSMutableArray
来存储此类的实例,从而创建一个书签列表,我在UITableView
中显示UITableViewCell
原型。
有人请提供一些关于如何将NSMutableArray
中的实例保存到文件中的建议/示例(可能还有一个如何加载它们的示例)。我找不到任何我搜索过的例子。我已尝试将数组转换为NSData
并使用NSKeyedArchiver
但未成功。我也试过转换为NSArray
,但无法让它发挥作用。
在自定义课程中,我实施了encodeWithCode
和initWithCoder
。
我需要在应用关闭之前保存,并且我想在应用启动时加载列表。
我被卡住了...... :(
编辑:应Ageektrapped的请求,以下是代码片段:
在我的Bookmark类的实现中:
- (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
。 (当调用下面的代码时,书签数组中至少有一个条目。)
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");
}
答案 0 :(得分:1)
我终于弄清楚我的问题是什么。
因为我正在我的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];