gpt4 book ai didi

ios - 删除表格 View 中的一行而不删除核心数据实体

转载 作者:行者123 更新时间:2023-12-01 18:17:30 26 4
gpt4 key购买 nike

我有一个由 NSFetchedResultsController 支持的表格 View 。
情况如下。
我已经实现了“滑动删除”一行。 NSFetchedResultsController 的委托(delegate)方法和表格 View 的委托(delegate)方法被调用。但问题是,我不想删除核心数据实体,我只想标记它的 bool 标志,因为我在应用程序的其他部分需要这个实体,并且希望表格 View 删除带有动画的行。但是,根据错误消息,如果您正在更新实体,更新一行,而不是删除它,这违反了逻辑。
有什么优雅的方法可以实现吗?或者唯一的选择是重新加载表?
滑动删除的实现

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

if (editingStyle == UITableViewCellEditingStyleDelete) {
Issue *issue = [self.fetchedResultsController objectAtIndexPath:indexPath];
[issue setHasBeenDeleted:[NSNumber numberWithBool:YES]];
[issue setPurchased:[NSNumber numberWithBool:NO]];
[self.managedObjectContext saveToPersistentStore:nil];
}
}

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id) anObject
atIndexPath:(NSIndexPath *)indexPath
forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath

...
        case NSFetchedResultsChangeUpdate:

[self.tableView deleteRowsAtIndexPaths:@[indexPath]
withRowAnimation:UITableViewRowAnimationAutomatic];
break;

NSFetchedResultsControllerDelegate
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
// The fetch controller has sent all current change notifications, so tell the table view to process all updates.
[self.tableView endUpdates];
}

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
// The fetch controller is about to start sending change notifications, so prepare the table view for updates.
[self.tableView beginUpdates];
}

错误信息

CoreData: error: Serious application error. An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:. Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (5) must be equal to the number of rows contained in that section before the update (4), plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out). with userInfo (null)

最佳答案

在您向 FRC 提供的获取请求中,将此 bool 值包含在您的谓词中。例如,[NSPredicate predicateWithFormat:@"shouldDisplay = YES"] .然后,每当您要删除特定对象时,只需将您的 shouldDisplay(或您所称的任何名称)设置为 NO,您将收到 controller:
didChangeObject:
的 FRC 委托(delegate)回调与 NSFetchedResultsChangeDelete改变类型。在此回调中,您将执行以下操作。

NSIndexPath *indexPath = [controller indexPathOfObject:anObject];
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];

您的对象将保留在核心数据中,但由于您在 bool 标志上的谓词,它将被从这个特定的 TableView 中过滤掉。

编辑:您还需要实现两个 FRC 委托(delegate)方法来通知您的 TableView 开始和结束更新。这将纠正您收到的错误。像这样:
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {

[self.tableView beginUpdates];
}

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {


[self.tableView endUpdates];
}

关于ios - 删除表格 View 中的一行而不删除核心数据实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20381884/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com