为什么我使用indexPathsForSelectedRows来选择要删除的所有单元格,但是我的应用程序崩溃了?

时间:2015-10-28 12:45:09

标签: ios uitableview

以下是我的一些代码

NSArray *selectedRows = [self.playHistoryTableView indexPathsForSelectedRows];
    if (selectedRows.count) {
        for (NSIndexPath *selectionIndex in selectedRows)
        {
            OneSery *sery = [self.playHistoryDic objectAtIndex:selectionIndex.row];
            [CoreDataManager deleteOneHistoryBySeryId:sery.seryId andVideoId:sery.latestVideo.videoId];
            [self.playHistoryDic removeObjectAtIndex:selectionIndex.row];
        }
        [self.playHistoryTableView deleteRowsAtIndexPaths:selectedRows withRowAnimation:UITableViewRowAnimationAutomatic];
    }

一次选择一个单元格时,效果很好。但当多重选择单元格时,它会像这样崩溃:

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

我知道这是什么意思,但我不知道我错在哪里。我试过,当它有三个单元格并且我选择第一个和第二个要删除时,它会删除第一个和第三个单元格。当它只有两个单元格时,我选择它们来删除它,它确实会崩溃我的应用程序。 当我调试它时,即使Onesery *sery值也是错误的。那么,当selectedRows合适时,selectionIndex怎么会出错?

非常感谢@Wain,最后完成了这些:

NSArray *selectedRows = [self.playHistoryTableView indexPathsForSelectedRows];
    NSMutableIndexSet *indicesOfItemsToDelete = [[NSMutableIndexSet alloc] init];
    if (selectedRows.count) {
        for (NSIndexPath *selectionIndex in selectedRows)
        {
            OneSery *sery = [self.playHistoryDic objectAtIndex:selectionIndex.row];
            [CoreDataManager deleteOneHistoryBySeryId:sery.seryId andVideoId:sery.latestVideo.videoId];
            [indicesOfItemsToDelete addIndex:selectionIndex.row];
        }
        [self.playHistoryDic removeObjectsAtIndexes:indicesOfItemsToDelete];
        [self.playHistoryTableView deleteRowsAtIndexPaths:selectedRows withRowAnimation:UITableViewRowAnimationAutomatic];
    }

1 个答案:

答案 0 :(得分:1)

在你的循环中你正在做

[self.playHistoryDic removeObjectAtIndex:selectionIndex.row];

因此您需要更改项目列表。在每次迭代中,您尝试访问一个项目,但在下一个项目移动后的第一个项目之后,因为您删除了一个项目。对于每个后续项目,情况更糟。

最终,您会尝试访问某个项目,但是已经删除了许多项目,而这些项目已经过了列表的末尾,然后就会崩溃。

您应该在循环中获取要删除的项目数组,并在循环完成后立即将它们全部删除。