Что не так с этим кодом удаления UITableView?

#ios #uitableview

#iOS #uitableview

Вопрос:

Я получаю приведенную ниже ошибку из следующего кода, пожалуйста, не могли бы вы сказать мне, в чем моя проблема.

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

 - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        id object = [[[self cdArray] objectAtIndex:indexPath.row] retain];
        [[self cdArray] removeObject:object];
        [[self managedObjectContext] deleteObject:object];
        [self refreshArray];
        NSError *error = nil;
        if (![[self managedObjectContext] save:amp;error]) {
            NSLog(@"n%sn%@", __PRETTY_FUNCTION__, [error description]);
        }
        [[self tableView] deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationTop];
    }
}

- (void) refreshArray {
    if ([self cdArray] == nil) {
        [self setCdArray:[[NSMutableArray alloc] init]];
    }
    [cdArray removeAllObjects];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSError *error = nil;
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Image" 
                                              inManagedObjectContext:[self managedObjectContext]];
    [fetchRequest setEntity:entity];
    NSArray *fetchedObjects = [[self managedObjectContext] executeFetchRequest:fetchRequest error:amp;error];    
    for (CDImage *image in fetchedObjects) {
        [cdArray addObject:image];
    }
    [[self tableView] reloadData];
    [fetchRequest release];
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
}
  

Ответ №1:

Вы не должны вызывать

 [self refreshArray];
  

до тех пор, пока вы не зафиксируете свое удаление здесь,

 NSError *error = nil;
if (![[self managedObjectContext] save:amp;error]) {
    NSLog(@"n%sn%@", __PRETTY_FUNCTION__, [error description]);
}
  

Вы должны переключить строки.

Комментарии:

1. Похоже, что удаления не происходит. Можете ли вы проверить количество объектов, возвращаемых во время выборки в refreshArray ?