2014-02-18 34 views
0

我有一个用于显示表格数据的对象数组(包含项目名称和创建日期)。我想用NSCoding协议保存这个数组。每次按下“提交”按钮提交新表格条目时,我都会调用saveDataToDisk方法。但是,我的应用程序在提交时崩溃。这是我第一次学习如何保存应用程序数据,我看了几个教程,我的表单看起来是一样的。我也在网上找了几天,找不到解决办法。哪里不对?无法通过NSCoding保存表格数据

这里是我的方法:

译码方法:

- (id)initWithCoder:(NSCoder *)decoder { 
self = [super initWithCoder:decoder]; 
if (!self) { 
    return nil; 
} 
self.itemArray = [decoder decodeObjectForKey:@"itemArray"]; 
return self; 
} 

编码方法:

- (void)encodeWithCoder:(NSCoder *)encoder { 
[encoder encodeObject:self.itemArray forKey:@"itemArray"]; 
} 

路径查找器方法:

- (NSString*) pathForDataFile 
{ 

NSFileManager * fileManager = [NSFileManager defaultManager]; 
NSString *documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,  NSUserDomainMask, YES)[0]; 
NSString *filePath = [documentsPath stringByAppendingPathComponent:@"appData"]; 


if([fileManager fileExistsAtPath:filePath] == NO) 
{ 
    [fileManager createDirectoryAtPath:filePath withIntermediateDirectories:NO attributes:nil error:nil]; 
} 

NSString *fileName = @"Budgetlist.appData"; 
return [filePath stringByAppendingPathComponent: fileName]; 
} 

保存数据的方法:

- (void) saveDataToDisk 
{ 
NSString * path = [self pathForDataFile]; 

NSMutableDictionary * rootObject; 
rootObject = [NSMutableDictionary dictionary]; 

[rootObject setValue: [self itemArray] forKey:@"itemArray"]; 
[NSKeyedArchiver archiveRootObject: rootObject toFile: path]; 
} 

加载数据的方法:

- (void) loadDataFromDisk 
{ 
NSString  * path  = [self pathForDataFile]; 
NSDictionary * rootObject; 

rootObject = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; 
[self setItemArray: [rootObject valueForKey:@"itemArray"]]; 
} 

我的按钮:

- (IBAction)submitButton:(id)sender { 
if (self.textField.text.length > 0 && [self.textField.text floatValue]>0) { 
    self.item = [[Data alloc] init]; 
    self.item.itemName = self.textField.text; 
    [self.itemArray addObject:self.item]; 
    [self.tableView reloadData]; 
    [self saveDataToDisk]; 
} 

} 

回答

0

您试图保存一个NSArray与自定义对象。

您的对象也必须实现NSCoding协议。在 “数据” 类

- (id)initWithCoder:(NSCoder *)decoder 
- (void)encodeWithCoder:(NSCoder *)encoder 

实现这些。 NSArray正在经历所有的对象,并调用每个对象的方法inisde数组

+0

谢谢你做到了。 – somethingstrang