gpt4 book ai didi

iphone - 使用 CoreData 在 UITableView 中动画行删除会导致断言失败

转载 作者:行者123 更新时间:2023-12-03 18:34:06 24 4
gpt4 key购买 nike

我有一个 UITableView,它显示用 CoreData 存储的对象列表。我可以使用以下代码删除对象:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
NSLog(@"Delete row");
[managedObjectContext deleteObject:[fetchedResultsController objectAtIndexPath:indexPath]];

// Save the context.
NSError *error;
if (![managedObjectContext save:&error]) {
/*do this gracefully one day */
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
[self refreshTables]; //where refreshTables just reloads the data the table is using and calls [self.tableView reloadData];
}

}

但它没有动画或美感。

当我尝试通过替换来制作动画

[self refreshTables]; 

[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

我收到以下错误:

Assertion failure in -[UITableView _endCellAnimationsWithContext:], >/SourceCache/UIKit_Sim/UIKit-1261.5/UITableView.m:920 2010-10-30 16:46:35.717 MyApp[38226:207] * Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (3) must be equal to the number of rows contained in that section before the update (3), plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted).'

我尝试过在 commitEditingStyle 代码中的多个位置添加 deleteRowsAtIndexPaths 代码,但没有成功(例如在从 mOC 中删除对象之前),但我似乎无法解决这个错误。

我知道 Apple 的 iPhoneCoreDataRecipes 示例通过为 FetchedResultsController 设置委托(delegate)来处理编辑/删除行来处理该问题,但在开发的现阶段,如果可能的话,我只想要一个简单的解决方案来对这些已删除的对象进行动画处理。

在从 ManagedObjectContext 中删除对象之前/之后,如何以动画方式删除行?

编辑:我尝试在从 mOC 中删除该项目之前和之后使用 deleteRowsAtIndexPaths ,但出现相同的错误。

最佳答案

当我们使用 NSFetchedResultsController 作为 UITableView 的数据源时,我们无法调用deleteRowsAtIndexPaths: withRowAnimation:
在函数 tableView: commitEditingStyle: forRowAtIndexPath: 中,这将抛出异常,如所提到的问题。

解决此问题的一种方法是从协议(protocol) NSFetchedResultsControllerDelegate 调用 controllerDidChangeContent: 中的[self.tableView reloadData]。它实际上解决了,但是,不再有删除淡入淡出动画了。

因此,另一种方便的方法是在 controller: didChangeObject: atIndexPath: forChangeType: 中调用 [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade] 新索引路径:.

示例代码如下:


- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle
forRowAtIndexPath:(NSIndexPath *)indexPath
{
// Delete NSManagedObject
NSManagedObject *object = [self.fetchedResultsController objectAtIndexPath:indexPath];
[context deleteObject:object];

// Save
NSError *error;
if ([context save:&error] == NO) {
// Handle Error.
}
}

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath
{
if (type == NSFetchedResultsChangeDelete) {
// Delete row from tableView.
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
}
}

关于iphone - 使用 CoreData 在 UITableView 中动画行删除会导致断言失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4057199/

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