删除行后,NSMutableArray的对象将返回异常

时间:2015-02-18 13:38:10

标签: ios objective-c uitableview nsrangeexception

这是我的问题:

我有一个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个元素......

笔记中的行removeObjectAtIndex(MutableArray)使我的应用程序崩溃,就像它被执行了两次......

感谢您的帮助......

Github Link

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

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

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

4 个答案:

答案 0 :(得分:0)

尝试使用以下代码..

- (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];

}

答案 1 :(得分:0)

首先删除UITableView's beginUpdatesendUpdates

其次删除UITableView's reloadData,因为在使用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);
    }
}

答案 2 :(得分:0)

问题是你要删除部分而不是行。

[notes removeObjectAtIndex:indexPath.section];应为[notes removeObjectAtIndex:indexPath.row];

同样[_gradesTV deleteSections应为[_gradesTV deleteRow...

注意: 您应该使用[_gradesTV deleteRow...[_gradesTV reloadData];因为两者都没用。我想说只需使用[_gradesTV deleteRow...

也不确定beginUpdates& endUpdates是为了什么。删除不必要的东西。

答案 3 :(得分:0)

好的,我想从哪里来了我的错误,只是因为我没有使用相同的MutableArray来获得部分的数量......

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

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

非常感谢大家,即使我自己也不注意这一点......