2014-11-29 3 views
0

У меня есть UITableView, который указан в порядке убывания, и каждая ячейка tableview связана с файлом. Данные для таблицы представлены с NSFetchResultsController. Я включил несколько удалений строк, но удаление выполнения, похоже, не запрограммировано правильно. Если у меня всего 5 строк, пятая строка будет наверху с индексом 0 и названием файла «track5». Строка 4 будет иметь файл «track4» и индекс 1 и так далее вплоть до строки 1 с файлом «track1» и индексом 4. У меня также есть NSLog, который выводит индекс каждой удаляемой строки и связанный файл.Удаление нескольких ячеек из таблицы данных ядра Удаление неправильной строки

При удалении, если выбрать строки 4,3, и 2 из 5 строк, я в конечном итоге удаление 4, 3 и 1.
Мои NSLog первый показывает индекс 1 и Track4 удаляется, следующий индекс 2 и трек 3 будет удален, затем индекс 3 и трек1 вместо трека2. Я предполагаю, что это происходит потому, что строки удаляются один за другим, а индекс каждой оставшейся строки изменяется из-за удаления предыдущих ячеек. Если я выберу строки 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

Построить массив, содержащий объекты для удаления, прежде чем делать какие-либо делеции:

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

Таким образом, делеции не запутывать в indexPaths для других выбранных строк.

Смежные вопросы