从 table 视图 objective c 中删除元素
delete element from table view objective c
我有一个 table 视图,其中充满了用户定义的数据。该数组是从 nsuserdefaults 收集的,并显示在 table 视图控制器中。我正在尝试实现删除功能。看起来不错,但是当我按删除时出现错误
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];
}
我感觉上面的代码就是问题所在。 NS用户默认值;我期望是一个 NSArray。那我怎么改呢 Mutable?
为了利益起见下面设置删除方法
- (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
}
}
非常感谢提前的帮助。
问题是 [[NSUserDefaults standardUserDefaults] objectForKey:@"favoritesArray"]
返回的是 NSArray
,而不是 NSMutableArray
。
解决方案是在从 NSUserDefaults
加载数组时创建数组的可变副本:
[[[NSUserDefaults standardUserDefaults] objectForKey:@"favoritesArray"] mutableCopy];
这是 Objective-C 类型系统中最令人困惑的方面之一。您自然会认为,如果系统允许您为 NSMutableArray
变量赋值,那么它一定是 NSMutableArray
(在 Swift 中,您是对的)。但是在 ObjC 中绝对不能保证这一点——语法使语言看起来像是静态类型的,但事实并非如此。
我有一个 table 视图,其中充满了用户定义的数据。该数组是从 nsuserdefaults 收集的,并显示在 table 视图控制器中。我正在尝试实现删除功能。看起来不错,但是当我按删除时出现错误
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];
}
我感觉上面的代码就是问题所在。 NS用户默认值;我期望是一个 NSArray。那我怎么改呢 Mutable?
为了利益起见下面设置删除方法
- (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
}
}
非常感谢提前的帮助。
问题是 [[NSUserDefaults standardUserDefaults] objectForKey:@"favoritesArray"]
返回的是 NSArray
,而不是 NSMutableArray
。
解决方案是在从 NSUserDefaults
加载数组时创建数组的可变副本:
[[[NSUserDefaults standardUserDefaults] objectForKey:@"favoritesArray"] mutableCopy];
这是 Objective-C 类型系统中最令人困惑的方面之一。您自然会认为,如果系统允许您为 NSMutableArray
变量赋值,那么它一定是 NSMutableArray
(在 Swift 中,您是对的)。但是在 ObjC 中绝对不能保证这一点——语法使语言看起来像是静态类型的,但事实并非如此。