在编辑模式下按删除按钮时UITableView崩溃

时间:2013-04-20 23:39:58

标签: ios xcode uitableview

编辑UITableView时,在有人按下uitableviewcell上的“删除”按钮后,应用程序通常会因此错误而崩溃。这通常发生在表视图中的第一个项目,但发生在其他项目上。我很抱歉这么模糊,我可以提供任何其他信息。我只是很困惑为什么会发生这种情况以及为什么会发生这种情况。

* 由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:' - [__ NSCFArray removeObjectAtIndex:]:发送到不可变对象的变异方法'

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.navigationItem.leftBarButtonItem = self.editButtonItem;
}

-(void)viewWillAppear:(BOOL)animated{
    [_matchIDS removeAllObjects];
    _matchIDS = [[NSMutableArray alloc]init];
    _matchIDS = [[NSUserDefaults standardUserDefaults] valueForKey:@"allMatchIDS"];
    [self.tableView reloadData];
}

-(void)viewWillDisappear:(BOOL)animated{
    NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
    [defaults setValue:_matchIDS forKey:@"allMatchIDS"];
    [defaults synchronize];
}

#pragma mark - Table View

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return _matchIDS.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    cell.textLabel.text = _matchIDS[indexPath.row];
    return cell;
}

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        [_matchIDS removeObjectAtIndex:indexPath.row];
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }
}

1 个答案:

答案 0 :(得分:1)

尝试从_matchIDS数组中删除元素时会产生错误,该数组是不可变的。

 [_matchIDS removeObjectAtIndex:indexPath.row];

您尝试在此处使数组可变:

-(void)viewWillAppear:(BOOL)animated{
    [_matchIDS removeAllObjects];
    _matchIDS = [[NSMutableArray alloc]init];
    _matchIDS = [[NSUserDefaults standardUserDefaults] valueForKey:@"allMatchIDS"]; // <---
    [self.tableView reloadData];
}

但上面标记的行替换了_matchIDS,丢弃了您实例化的NSMutableArray。您可能希望使用mutableCopy方法,从而产生如下内容:

_matchIDS = [[[NSUserDefaults standardUserDefaults] valueForKey:@"allMatchIDS"] mutableCopy];