我有一个UITableView
按降序列出,每个tableview单元格与一个文件相关联。 tableview的数据来自NSFetchResultsController
。我已启用多行删除但删除执行似乎没有正确编程。如果我只有5行,则第五行将位于顶部,索引为0,文件标题为“track5”。第4行将有一个文件“track4”和一个索引1,依此类推,一直到第1行,文件“track1”,索引为4.我还有一个NSLog,它输出每行被删除的索引和相关文件。
删除时,如果我从5行中选择第4,3行和第2行,我最终会删除4,3和1。 我的NSLog首先显示索引1和track4被删除,下一个索引2和轨道3被删除,然后索引3和track1而不是track2。我假设这种情况正在发生,因为行被逐个删除,并且每个剩余行的索引正在改变,因为先前的单元格被删除。如果我按顺序选择第2,3和4行,一切都会完全删除。它只有当我按降序删除时。什么是解决这个问题的最佳方法?
-(void) newMultiDelete
{
NSArray *selectedRows = [self.audioTable indexPathsForSelectedRows];
BOOL deleteSpecificRows = selectedRows.count > 0;
if (deleteSpecificRows)
{
for (NSIndexPath *selectionIndex in selectedRows)
{
Recording * recording = [self.fetchCon objectAtIndexPath:selectionIndex];
NSString * pathOfLastTrack = [self.managedDocument pathOfLastTrack];
NSLog(@"Index path %li and title %@", (long)selectionIndex.row, recording.audioURL);
[self.managedDocument.managedObjectContext deleteObject:recording];
NSURL * audioURL = [[NSURL alloc] initWithString:recording.audioURL];
[self.managedDocument removeFile:audioURL];
}
}
[self.managedDocument.managedObjectContext save:nil];
[self.managedDocument updateSaveContext];
[self.audioTable reloadData];
}
答案 0 :(得分:1)
在进行任何删除之前构建一个包含要删除的对象的数组:
-(void) newMultiDelete
{
NSArray *selectedRows = [self.audioTable indexPathsForSelectedRows];
BOOL deleteSpecificRows = selectedRows.count > 0;
if (deleteSpecificRows)
{
NSMutableArray *objectsToDelete = [NSMutableArray array];
for (NSIndexPath *selectionIndex in selectedRows)
{
Recording * recording = [self.fetchCon objectAtIndexPath:selectionIndex];
[objectsToDelete addObject:recording];
NSLog(@"Index path %li and title %@", (long)selectionIndex.row, recording.audioURL);
}
for (Recording *recording in objectsToDelete)
{
NSString * pathOfLastTrack = [self.managedDocument pathOfLastTrack];
NSURL * audioURL = [[NSURL alloc] initWithString:recording.audioURL];
[self.managedDocument removeFile:audioURL];
[self.managedDocument.managedObjectContext deleteObject:recording];
}
}
[self.managedDocument.managedObjectContext save:nil];
[self.managedDocument updateSaveContext];
[self.audioTable reloadData];
}
因此,删除不会污染其他所选行的indexPath。