以下是我的一些代码
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怎么会出错?
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];
}
答案 0 :(得分:1)
在你的循环中你正在做
[self.playHistoryDic removeObjectAtIndex:selectionIndex.row];
因此您需要更改项目列表。在每次迭代中,您尝试访问一个项目,但在下一个项目移动后的第一个项目之后,因为您删除了一个项目。对于每个后续项目,情况更糟。
最终,您会尝试访问某个项目,但是已经删除了许多项目,而这些项目已经过了列表的末尾,然后就会崩溃。
您应该在循环中获取要删除的项目数组,并在循环完成后立即将它们全部删除。