Ошибка удаления строки в UITableView - PullRequest
1 голос
/ 21 января 2012

Я получаю эту ошибку при попытке удалить строку из UITableView.Если я удаляю последнюю строку в табличном представлении, это не ошибка, и все работает нормально, но любая другая строка выдает исключение.Может кто-нибудь сказать мне, что я здесь делаю не так?Любая помощь будет принята с благодарностью!

Ошибка:

'Неверное обновление: недопустимое количество строк в разделе 1. Количество строк в существующемраздел после обновления (2) должен быть равен числу строк, содержащихся в этом разделе до обновления (2), плюс или минус количество строк, вставленных или удаленных из этого раздела (0 вставлено, 1 удалено) и плюс или минусколичество строк, перемещенных в этот раздел или из него (0 перемещено, 0 перемещено). '

Код

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

    //1. clear existing URL's
    NSURL *urlToDelete = nil;

    //2. If row is deleted, remove it from the list.
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        NSInteger row = [indexPath row];
        urlToDelete = [documentURLs objectAtIndex:row];
        //[documentURLs removeObjectAtIndex:row];      
    }
    //3. update the tableview on the fly without reloading the data
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                     withRowAnimation:UITableViewRowAnimationFade];

    //4. get the location of the files
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *pathToDocumentsDirectory = [paths objectAtIndex:0];

    //5.setup file manager
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    BOOL fileExists = [fileManager fileExistsAtPath:pathToDocumentsDirectory];
    NSLog(@"Path to file: %@", pathToDocumentsDirectory);        
    NSLog(@"File exists: %d", fileExists);
    NSLog(@"Is deletable file at path: %d", [fileManager isDeletableFileAtPath:pathToDocumentsDirectory]);

    //6. remove if matches
    if (urlToDelete) {
        BOOL success = [fileManager removeItemAtURL:urlToDelete error:&error];
        if (!success) NSLog(@"Error: %@", [error localizedDescription]);
    }
}

Ответы [ 3 ]

3 голосов
/ 21 января 2012

Вы должны обновить таблицу в три этапа.

1) Разобраться с вашей моделью

[documentURLs removeObjectAtIndex:row];

2) Разобраться с анимацией вашего стола

[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

3) Обработайте обновление вашего файла (возможно, это можно было сделать раньше, потому что у вас может быть ошибка при удалении файла)

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

   NSURL *urlToDelete = nil;

   if (editingStyle == UITableViewCellEditingStyleDelete) {
       NSInteger row = [indexPath row];
       urlToDelete = [documentURLs objectAtIndex:row];
       [documentURLs removeObjectAtIndex:row]; // you need to update your model

       [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]    withRowAnimation:UITableViewRowAnimationFade];

       // do stuff to update the file here
    }
}

или

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

    NSURL *urlToDelete = nil;

    if(editingStyle == UITableViewCellEditingStyleDelete) {
        NSInteger row = [indexPath row];
        urlToDelete = [documentURLs objectAtIndex:row];

        // do stuff to update the file here...

        if(success)
        {
            [documentURLs removeObjectAtIndex:row]; // you need to update your model

            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]    withRowAnimation:UITableViewRowAnimationFade];
        }
   }
}

Примечание.Вы должны обратить внимание, если вы удаляете элемент из вашей модели, и количество моделей равно 0. В этом случае вы должны удалить весь раздел.

Надеюсь, это поможет.

PSпроверьте код, потому что я написал без XCode

0 голосов
/ 21 января 2012

Шаг 3 должен быть внутри шага 2, если он блокируется - удалять можно только в том случае, если editStyle удаляется. В противном случае вы удаляете строки из таблицы, не корректируя другие структуры данных.

//2. If row is deleted, remove it from the list.
if (editingStyle == UITableViewCellEditingStyleDelete) {
    NSInteger row = [indexPath row];
    urlToDelete = [documentURLs objectAtIndex:row];
    [documentURLs removeObjectAtIndex:row];      
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]   
                     withRowAnimation:UITableViewRowAnimationFade];
}
0 голосов
/ 21 января 2012

вам нужно обернуть удаление в начале и конце обновления, как в примере

[self.wallsTable beginUpdates]; //<<<<<<<<<<<<<<<<<<<<<<<<<
NSArray *paths = [NSArray arrayWithObject: deleteView.cellPath];
[self.wallsTable deleteRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationTop];
[[self.wallEntries objectAtIndex:[deleteView.cellPath section]] removeObjectAtIndex:[deleteView.cellPath row]];
[self.wallsTable endUpdates]; //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

так что вам нужно убрать со стола и из всего, что питает клетки в этих

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...