因此,在保存数组时,我遇到了NSUserDefaults的问题。我的所有代码都一直运行到这一点,但是当我尝试在NSUserDefaults中保存数组时,我开始遇到问题,主要是由于某些原因它现在无法保存。
- (IBAction)unwindToList:(UIStoryboardSegue *)segue
{
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"MMMM dd, yyyy"];
AG_AddItemViewController *source = [segue sourceViewController];
AG_Storage *item = source.store;
NSDate *dateCreated = item.creationDate;
NSString *todayString = [dateFormat stringFromDate:self.todayDate];
NSString *dateCreatedString = [dateFormat stringFromDate:dateCreated];
NSString *tomorrowString = [dateFormat stringFromDate:self.tomorrowsDate];
NSString *yesterdayString = [dateFormat stringFromDate:self.yesterdaysDate];
//Set up file storage!
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if (item.itemName != nil) {
if ([dateCreatedString isEqualToString:todayString]) {
[self.mainArray addObject:item];
[tableView reloadData];
[defaults setObject:self.mainArray forKey:todayString];
[defaults synchronize];
NSLog(@"Saved");
}
else if ([dateCreatedString isEqualToString:tomorrowString]){
[self.tomorrowArray addObject:item];
[tableView reloadData];
NSLog(@"THIS WORKED TOO :D");
}
else if ([dateCreatedString isEqualToString:yesterdayString]){
[self.yesterdayArray addObject:item];
[tableView reloadData];
NSLog(@"THIS WORKED");
}
else{
}
}
}
mainarray
和其他可变数组都在接口中声明为属性,因此它们不应该导致此问题。
2014-03-26 15:36:46.561 AgendaBk[32702:a0b] <AG_Storage: 0x8cc2c90>
2014-03-26 15:36:46.563 AgendaBk[32702:a0b] Attempt to set a non-property-list object (
"<AG_Storage: 0x8cc2c90>"
) as an NSUserDefaults value for key March 26, 2014
2014-03-26 15:36:46.565 AgendaBk[32702:a0b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSUserDefaults setObject:forKey:]: attempt to insert non-property list object (
"<AG_Storage: 0x8cc2c90>" ) for key March 26, 2014'
libc++abi.dylib: terminating with uncaught exception of type NSException
请注意,只有在我尝试启动NSUserDefaults时才会出现此问题。其他一切似乎都运行正常,当我早些时候添加单个字符串时,它运行正常。如果我可以管理它,我真的想用它来存储我的数组。
答案 0 :(得分:0)
NSUserDefaults
仅支持plist对象,因此您无法将自定义对象保存到其中。您将类型AG_Storage
的对象添加到数组中并保存,这是不允许的。您需要通过NSKeyedArchiving
符合AG_Storage
协议来查看NSCoding
。如果您需要更多指导,请告诉我。
答案 1 :(得分:0)
文档说:
NSUserDefaults类提供了便于访问的方法 常见类型,例如浮点数,双精度数,整数,布尔值和URL。一个 默认对象必须是属性列表,即(或 对于集合的实例组合):NSData,NSString, NSNumber,NSDate,NSArray或NSDictionary
但是你试图保存AG_Storage实例。如果你想存储任何类型的对象,你应该尝试序列化你的对象。例如,实现NSCoding协议。
答案 2 :(得分:0)
看一下类似问题的答案(我相信你遇到了同样的问题):https://stackoverflow.com/a/19720674/694080
您的AG_Storage不是默认的NSCoding兼容类之一。
答案 3 :(得分:0)
如果有人提出这个问题,请确保您要保存的项目中没有 null / nil ,如果您有&#39;重新尝试保存一个空对象。