gle*_*rey 8 iphone cocoa-touch core-data uitableview
我有一个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];
}
}
Run Code Online (Sandbox Code Playgroud)
但它没有动画或美学.
当我尝试通过替换动画
[self refreshTables];
Run Code Online (Sandbox Code Playgroud)
同
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
断言失败 - [UITableView _endCellAnimationsWithContext:],> /SourceCache/UIKit_Sim/UIKit-1261.5/UITableView.m:920 2010-10-30 16:46:35.717 MyApp [38226:207] *由于未捕获异常而终止应用程序'NSInternalInconsistencyException ',reason:'无效更新:第0节中的行数无效.更新后的现有部分中包含的行数(3)必须等于更新前该部分中包含的行数(3),加上或减去从该部分插入或删除的行数(插入0,删除1).
我已经尝试在commitEditingStyle代码中的各种位置使用deleteRowsAtIndexPaths代码而没有运气(例如在从mOC中删除对象之前)但我似乎无法解决此错误.
我知道Apple的iPhoneCoreDataRecipes示例通过设置FetchedResultsController的委托处理编辑/删除行来处理问题,但是在开发的这个阶段,如果可能的话,我只想要一个简单的解决方案来动画那些被删除的对象.
在从managedObjectContext中删除对象之前/之后,如何设置行的删除动画?
编辑:我已经尝试在从mOC中删除项目之前和之后使用deleteRowsAtIndexPaths,但具有相同的错误.
Rob*_*bin 17
当我们使用NSFetchedResultsController作为UITableView的DataSource时,我们无法deleteRowsAtIndexPaths: withRowAnimation:
在函数中调用tableView: commitEditingStyle: forRowAtIndexPath:,这将引发异常,如上所述.
解决这个问题的一种方法是通过调用[self.tableView reloadData]在controllerDidChangeContent:从协议NSFetchedResultsControllerDelegate.它实际上解决了,不再有删除淡入淡出动画.
因此,替代简便的方法是通过调用[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]在controller: didChangeObject: atIndexPath: forChangeType:
newIndexPath:.
示例代码如下:
- (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];
}
}
Run Code Online (Sandbox Code Playgroud)
1)我建立了一个正确的代表.
2)我在viewWillLoad中删除了一个调用[self.tableview reloadData]; 这是(奇怪的)弄乱一切(这篇文章给了我一个线索,寻找和删除:核心数据中的严重应用程序错误与fetchedResultsContainer).
| 归档时间: |
|
| 查看次数: |
16541 次 |
| 最近记录: |