2

我正在尝试使用 UITableViewDiffableDataSource 实现我现有的 coredata 项目。我的 tableview 是使用 NSFetchedResultsController 和相应的委托方法耦合的。我可以使用 diffabledatasource 列出 tableview 中的数据。我的数据源使用以下泛型类型声明

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 耦合的正确方法。任何帮助将不胜感激。提前致谢

4

2 回答 2

1

您不应该编辑快照,而是编辑模型。即删除托管对象如下:

- (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

于 2020-05-27T21:25:33.997 回答
1

而不是tableView(_:commit:)UITableViewDiffableDataSource实现中覆盖

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

在视图控制器中并通过索引路径从获取的结果控制器中获取对象。

于 2020-01-05T12:28:30.670 回答