NSMutableArray 的 addObject 不起作用
addObject for NSMutableArray not working
@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];
}
addOneBill:
方法中的addObject
方法无效
我google过同样的问题,其他人也遇到了这个问题。建议为可变数组添加 [[NSMutableArray alloc] init]
的答案。我做了但没有用。
试试看
NSMutableArray *billsArr = [[self.billsUserDefault objectForKey:@"billArray"] mutableCopy];
在 getBillsArray
NSUserDefaults
对象不是不可变的。你必须让它们可变。
试试下面的代码。
NSMutableArray *billsArr = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"billArray"]];
- (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 分配] 初始化];
然后在此处将其设置为零:
self.billsArray = [self getBillsArray];
在您的 getBillsArray
方法中,添加 mutableCopy
调用以获取 objectForKey
的可变数组。因为从 NSUserDefaults
得到的对象是不可变的。修改后的代码如下所示:
- (NSMutableArray *)getBillsArray {
NSMutableArray *billsArr = [[self.billsUserDefault objectForKey:@"billArray"] mutableCopy];
return billsArr;
}
编辑:
您正在数组中添加自定义对象并尝试保存在 NSUserDefaults
中,这是不可能的。您需要将您的对象转换为 NSDictionary
对象,其中每个键值对将代表该对象的一个变量。如果您的自定义对象也包含自定义对象,您将不得不递归地执行此转换步骤。
另一个解决方案:关于它为什么不起作用的解释,请参阅 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];
@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];
}
addOneBill:
方法中的addObject
方法无效
我google过同样的问题,其他人也遇到了这个问题。建议为可变数组添加 [[NSMutableArray alloc] init]
的答案。我做了但没有用。
试试看
NSMutableArray *billsArr = [[self.billsUserDefault objectForKey:@"billArray"] mutableCopy];
在 getBillsArray
NSUserDefaults
对象不是不可变的。你必须让它们可变。
试试下面的代码。
NSMutableArray *billsArr = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"billArray"]];
- (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 分配] 初始化];
然后在此处将其设置为零: self.billsArray = [self getBillsArray];
在您的 getBillsArray
方法中,添加 mutableCopy
调用以获取 objectForKey
的可变数组。因为从 NSUserDefaults
得到的对象是不可变的。修改后的代码如下所示:
- (NSMutableArray *)getBillsArray {
NSMutableArray *billsArr = [[self.billsUserDefault objectForKey:@"billArray"] mutableCopy];
return billsArr;
}
编辑:
您正在数组中添加自定义对象并尝试保存在 NSUserDefaults
中,这是不可能的。您需要将您的对象转换为 NSDictionary
对象,其中每个键值对将代表该对象的一个变量。如果您的自定义对象也包含自定义对象,您将不得不递归地执行此转换步骤。
另一个解决方案:关于它为什么不起作用的解释,请参阅 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];