我有一个包含许多行的tableview,我希望能够删除这些行。填充tableview的数据存储在NSMutableArray中。要删除一行上的数据,我打电话:
- (void)deleteFromArray:(NSUInteger) number{
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; //load NSUserDefaults
NSMutableArray *storedArray = [[ NSMutableArray alloc] init];
storedArray = [prefs objectForKey: @"mydata"];
[storedArray removeObjectAtIndex:number];
[prefs setObject:storedArray forKey:@"mydata"];
[storedArray release];
[prefs synchronize];
}
这
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
subscribe *subscribeclass = [subscribe alloc];
[subscribeclass deleteFromArray: indexPath.row];
[myTableView reloadData];
}
}
第一次删除行时这很好用。但是当我删除秒行时,应用程序在deleteFromArray中的以下行崩溃:
[storedArray removeObjectAtIndex:number];
任何想法为什么?
答案 0 :(得分:5)
来自NSUserDefaults的数组是NSArray,而不是NSMutableArray。您应该将代码修改为:
- (void)deleteFromArray:(NSUInteger) number{
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; //load NSUserDefaults
NSMutableArray *storedArray = [[prefs objectForKey:@"mydata"] mutableCopy];
[storedArray removeObjectAtIndex:number];
[prefs setObject:storedArray forKey:@"mydata"];
[storedArray release];
[prefs synchronize];
}
这会创建一个不可变数组的副本并使其可变,以便您可以对其进行修改。
答案 1 :(得分:1)
你只能在默认情况下存储不可变的NSArrays。即使对象是可变的,它也存储为不可变的
所以而不是
NSMutableArray *storedArray = [[ NSMutableArray alloc] init];
storedArray = [prefs objectForKey: @"mydata"];
尝试:
[NSMutableArray arrayWithArray:[prefs objectForKey: @"mydata"]];
答案 2 :(得分:0)
问题是从objectForKey返回的数组是不可变的。 所以你可以看到其他人做了什么:Storing custom objects in an NSMutableArray in NSUserDefaults