Метод делегата 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? { ...
в контроллере представления и получить объект по пути индекса из полученного контроллера результатов.