Метод делегата NFetchedResultsController didChangeContentWith не вызывается при удалении элемента с помощью табличного представления UIDIffableDataSource

Я пытаюсь реализовать свой существующий проект coredata, используя UITableViewDiffableDataSource. Мой tableview связан с использованием NSFetchedResultsController и соответствующих методов делегата. Я могу перечислить данные в виде таблицы, используя diffabledatasource. Мой источник данных объявлен с универсальными типами, как показано ниже

UITableViewDiffableDataSource<String, NSManagedObjectID>

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

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
  if editingStyle == .delete {
     if let identifierToDelete = itemIdentifier(for: indexPath){
        var snapshot = self.snapshot()
        snapshot.deleteItems([identifierToDelete])
        apply(snapshot)
     }
  }}

Приведенный ниже метод NSFetchedResultsControllerDelegate не вызывается, когда я удаляю ячейку.

func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChangeContentWith snapshot: NSDiffableDataSourceSnapshotReference) 

Я не уверен, что это правильный способ связи diffabledatasource с NSFetchedResultscontroller. Любая помощь будет оценена по достоинству. заранее спасибо

2 ответа

Вы не должны редактировать снимок, вместо этого редактируйте модель. Т.е. удалите управляемый объект следующим образом:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {  
    if (editingStyle == UITableViewCellEditingStyleDelete) {  
        NSManagedObjectContext *context = self.managedObjectContext;  
        NSManagedObjectID *objectID = [self itemIdentifierForIndexPath:indexPath];  
        Event *event = [context objectWithID:objectID];  
        [context deleteObject:event];  
        NSError *error = nil;  
        if (![context save:&error]) {  
            // Replace this implementation with code to handle the error appropriately.  
            // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.  
            NSLog(@"Unresolved error %@, %@", error, error.userInfo);  
            abort();  
        }  
    }  
}  

После удаления объекта didChangeContentWith Объект моментального снимка будет вызван с новым снимком, содержащим это изменение, которое вы можете применить к своему источнику данных.

Примечание: вам нужно добавить managedObjectContext собственность к вашему UITableViewDiffableDataSource подкласс.

Вместо того, чтобы отменять tableView(_:commit:) в UITableViewDiffableDataSource осуществлять

override func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? { ...

в контроллере представления и получить объект по пути индекса из полученного контроллера результатов.