从表视图目标c中删除元素

时间:2016-06-18 13:51:42

标签: ios objective-c nsmutablearray nsarray

我有一个表格视图,其中包含用户定义的数据。数组从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
  }
}

事先得到帮助。

1 个答案:

答案 0 :(得分:2)

问题是[[NSUserDefaults standardUserDefaults] objectForKey:@"favoritesArray"]正在返回NSArray,而不是NSMutableArray

解决方案是在从NSUserDefaults加载数组时创建数组的可变副本:

[[[NSUserDefaults standardUserDefaults] objectForKey:@"favoritesArray"] mutableCopy];

这是Objective-C类型系统中最令人困惑的方面之一。您自然会认为,如果系统允许您为NSMutableArray变量分配内容,那么它必须是NSMutableArray(在Swift中,您是对的)。但是在ObjC中绝对没有保证 - 语法使语言看起来像静态类型,但事实并非如此。