0

我有一个自定义类“书签”,其中包含一个NSString. 我使用 aNSMutableArray来存储此类的实例,从而制作了一个书签列表,我UITableViewUITableViewCell原型将其显示在 a 中。

有人可以就如何将实例保存NSMutableArray到文件中提供一些建议/示例(也许还有如何加载它们的示例)。我找不到任何我搜索过的例子。我尝试将数组转换为NSData并使用NSKeyedArchiver但没有成功。我也尝试过转换为 anNSArray但无法正常工作。

在我实现的自定义类中encodeWithCodeinitWithCoder.

我需要在应用程序关闭之前保存,并且我想在应用程序启动时加载列表。

我被困住了... :(

编辑:应 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");
}
4

1 回答 1

1

我终于弄清楚我的问题是什么。因为我在我的 iPhone 设备上调试,所以有些文件夹是不可写的。我使用的代码是要求在这样一个区域(NSDocumentationDirectory)中的位置:

终于找到 => 如何在 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];
于 2013-04-06T12:42:31.740 回答