我有一个表格视图,其中包含用户定义的数据。数组从nsuserdefaults收集并显示在表视图控制器中。我正在尝试实现删除功能。它看起来很好,但当我按删除错误来
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFArray removeObjectAtIndex:]: mutating method sent to immutable object'
我对Favourites.h的代码
#import <UIKit/UIKit.h>
@interface FavoritesViewController: UITableViewController <UITableViewDelegate, UITableViewDataSource>
@property(nonatomic, strong) IBOutlet UITableView *tableView;
@property (nonatomic,strong) NSMutableArray *favoriteItems;
@end
然后我初始化的那块
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
favoriteItems= [[NSUserDefaults standardUserDefaults] objectForKey:@"favoritesArray"];
[self.tableView reloadData];
}
我觉得上面的代码就是问题所在。 NSUserDefaults的;我期待的是NSArray。那么如何改变它呢?
为了兴趣起见,以下设置了删除方法
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
//remove the deleted object from your data source.
//If your data source is an NSMutableArray, do this
[self.favoriteItems removeObjectAtIndex:indexPath.row];
[[NSUserDefaults standardUserDefaults] setObject:favoriteItems forKey:@"favoritesArray"];
[self.tableView reloadData]; // tell table to refresh now
}
}
事先得到帮助。
答案 0 :(得分:2)
问题是[[NSUserDefaults standardUserDefaults] objectForKey:@"favoritesArray"]
正在返回NSArray
,而不是NSMutableArray
。
解决方案是在从NSUserDefaults
加载数组时创建数组的可变副本:
[[[NSUserDefaults standardUserDefaults] objectForKey:@"favoritesArray"] mutableCopy];
这是Objective-C类型系统中最令人困惑的方面之一。您自然会认为,如果系统允许您为NSMutableArray
变量分配内容,那么它必须是NSMutableArray
(在Swift中,您是对的)。但是在ObjC中绝对没有保证 - 语法使语言看起来像静态类型,但事实并非如此。