从核心数据tableview中删除多个单元格删除错误的行

时间:2014-11-29 01:16:54

标签: ios uitableview core-data

我有一个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];
}

1 个答案:

答案 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。