删除行后删除 NSMutableArray returns 异常的对象

Removing object of NSMutableArray returns exception after row deleting

这是我的问题:

我有一个 NSMutableArray *notes 并且它是我 UITableView* _gradesTV 的来源。

我在此处添加了方法 - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{

    if (editingStyle == UITableViewCellEditingStyleDelete) {

        NSLog(@"%ld", (long)indexPath.section);
        NSLog(@"%@", notes);




        [_gradesTV beginUpdates];

        [notes removeObjectAtIndex:indexPath.section];

        [_gradesTV deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section]
                 withRowAnimation:UITableViewRowAnimationFade];

        [_gradesTV endUpdates];




        NSLog(@"%@", notes);
    }

[_gradesTV reloadData];

}

但是当我删除一个元素时我得到这个错误:

*** Terminating app due to uncaught exception 'NSRangeException',
 reason: '*** -[__NSArrayM objectAtIndex:]: index 2 beyond bounds [0 .. 1]'

但是我在 MutableArray 上创建的 NSLog 显示了 3 个元素...

注释(Mutable数组)上的removeObjectAtIndex行使我的应用程序崩溃,就像执行了两次一样...

感谢您的帮助...

Github Link

如果你想拉项目并尝试...

您必须使用 + 按钮创建成绩,然后您可以尝试删除我的 table 视图中的项目。

添加成绩时,第一个 TextField 是 string,第二个是 double 值,第三个也是 double 值。

尝试使用以下代码..

- (NSInteger)numberOfSections {
    return [notes count];
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{

    if (editingStyle == UITableViewCellEditingStyleDelete) {

        NSLog(@"%ld", (long)indexPath.section);
        NSLog(@"%@", notes);
        [notes removeObjectAtIndex:indexPath.section];
        NSLog(@"%@", notes);
    }

[_gradesTV reloadData];

}

首先删除UITableView'sbeginUpdatesendUpdates

其次删除UITableView'sreloadData因为在使用UITableViewCellEditingStyleDeleteUITableViewCellEditingStyleInsert

时不需要

现在您的代码将是:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{

    if (editingStyle == UITableViewCellEditingStyleDelete) {

        NSLog(@"Current Section : %ld", (long)indexPath.section);
        NSLog(@"Before : %@", notes);

        [notes removeObjectAtIndex:indexPath.section];

        // Either delete some rows within a section (leaving at least one) or the entire section.
        id sectionDataSource = [notes objectAtIndex:indexPath.section];
        if ([sectionDataSource count] > 0)
        {
            // Section is not yet empty, so delete only the current row.
            [_gradesTV deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                             withRowAnimation:UITableViewRowAnimationFade];
        }
        else
        {
            // Section is now completely empty, so delete the entire section.
            [_gradesTV deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section] 
                     withRowAnimation:UITableViewRowAnimationFade];
        }

        NSLog(@"After : %@", notes);
    }
}

问题是您删除的是节而不是行。

[notes removeObjectAtIndex:indexPath.section]; 应该是 [notes removeObjectAtIndex:indexPath.row];

另外[_gradesTV deleteSections应该是[_gradesTV deleteRow...

注意: 你应该使用[_gradesTV deleteRow...[_gradesTV reloadData];,因为两者都没有用.我会说只需使用 [_gradesTV deleteRow...

也不确定 beginUpdatesendUpdates 是为了什么。删除不需要的东西。

好吧,我知道我的错误是从哪里来的,只是我没有使用相同的 MutableArray 来获取部分的数量...

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return [notes count];
}

旧方法有一个旧的 NSMutableArray 我用来测试我的代码...

谢谢大家,虽然我太菜鸟了,自己没注意到....