@property (strong, nonatomic)NSMutableArray *billsArray;
- (void)viewDidLoad {
[super viewDidLoad];
self.billsUserDefault = [NSUserDefaults standardUserDefaults];
self.billsArray = [[NSMutableArray alloc] init];
self.billsArray = [self getBillsArray];
}
- (NSMutableArray *)getBillsArray {
NSMutableArray *billsArr = [self.billsUserDefault objectForKey:@"billArray"];
return billsArr;
}
- (void)AddOneBill:(Bill *)bill {
// add bill to array
[self.billsArray addObject:bill];
// store the new bill
[self.billsUserDefault setObject:self.billsArray forKey:@"billArray"];
[self.billsUserDefault synchronize];
// reload the table view
[self.billTableView reloadData];
}
addObject
方法中的addOneBill:
方法不起作用。
我搜索了同样的问题,其他人也遇到了这个问题。答案建议为可变数组添加[[NSMutableArray alloc] init]
。我做了但不行。
答案 0 :(得分:1)
在getBillsArray
方法中,添加mutableCopy
调用以获取objectForKey
的可变数组。因为来自NSUserDefaults
的对象不可变。修改后的代码如下所示:
- (NSMutableArray *)getBillsArray {
NSMutableArray *billsArr = [[self.billsUserDefault objectForKey:@"billArray"] mutableCopy];
return billsArr;
}
修改强>
您正在数组中添加自定义对象并尝试保存在NSUserDefaults
中,这是不可能的。您需要将对象转换为NSDictionary
对象,其中每个键值对将表示该对象的一个变量。如果自定义对象还包含自定义对象,则必须递归执行此转换步骤。
答案 1 :(得分:0)
尝试
NSMutableArray *billsArr = [[self.billsUserDefault objectForKey:@"billArray"] mutableCopy];
getBillsArray
答案 2 :(得分:0)
NSUserDefaults
个对象不是不可变的。你必须使它们变得可变。
尝试以下代码。
NSMutableArray *billsArr = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"billArray"]];
答案 3 :(得分:0)
- (void)viewDidLoad {
[super viewDidLoad];
self.billsUserDefault = [NSUserDefaults standardUserDefaults];
self.billsArray = [[NSMutableArray alloc] init];
self.billsArray = [self getBillsArray];
}
在viewDidLoad中,您调用getBillsArray。但是userDefauls中key-billArray的值是什么,你可以在viewController启动时得到什么?
在addOneBill方法中为此键设置数组。 所以在viewDidLoad中你创建了mutableArray: self.billsArray = [[NSMutableArray alloc] init];
然后将其设置为nil: self.billsArray = [self getBillsArray];
答案 4 :(得分:0)
另一个解决方案:为了解释为什么它不起作用,请参阅Salman的答案(来自NSUserDefaults的返回值不可变)
- (void)viewDidLoad {
[super viewDidLoad];
self.billsUserDefault = [NSUserDefaults standardUserDefaults];
self.billsArray = [[NSMutableArray alloc] init];
[self.billsArray addObjectsFromArray: [self getBillsArray]];
}
- (NSArray *)getBillsArray {
NSArray *billsArr = [self.billsUserDefault objectForKey:@"billArray"];
return billsArr;
}
为了将'Bill'对象保存到NSUserDefaults中,如果它来自NSObject,你可以使用NSKeyedArchiver& NSKeyedUnarchvier:
//encode
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:your_bill_array];
//then save to NSUserDefaults
//decode:
id result = [NSKeyedUnarchiver unarchiveObjectWithData:data_returned_from_NSUSerDefaults];