【问题标题】:Deleting Row from TableView and coreData从 TableView 和 coreData 中删除行
【发布时间】:2013-08-15 10:11:34
【问题描述】:

我在从一个填充了 coreData 对象的 tableView 中删除行时遇到了一些问题。

尝试这样做:

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

        if (editingStyle == UITableViewCellEditingStyleDelete) {

            [self.tableView beginUpdates];

            NSManagedObject *managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath];
            NSLog(@"Deleting (%@)", [managedObject valueForKey:@"original_title"]);
            [self.managedObjectContext deleteObject:managedObject];
            [self.managedObjectContext save:nil];

            [self performFetch];       
            [self.tableView endUpdates];       
        }   
    }

因此,当我单击“删除”按钮时,应用程序崩溃并显示以下日志:

    *** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-2872.3/UITableView.m:1254
    2013-08-13 18:39:17.624 RR_proto[1076:a0b] *** Terminating app due to uncaught exception
 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of sections. 
 The number of sections contained in the table view after the update (1) must be equal 
to the number of sections contained in the table view before the update (2), plus or minus
 the number of sections inserted or deleted (0 inserted, 0 deleted).'
    *** First throw call stack:

我还尝试在 [self.managedObjectContext save:nil] 之后添加以下行:

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

但应用程序像以前一样崩溃。

还有一件事,每次我通过delete-action崩溃后再次启动应用程序时,应该删除的单元格真的消失了!

如果有人可以提供帮助,那就太好了。 我知道有很多关于类似问题的问题,我尝试了与这些不同的事情,但没有成功。 谢谢!

【问题讨论】:

    标签: ios objective-c core-data tableview delete-row


    【解决方案1】:

    表格视图由获取的结果控制器委托自动更新 添加、删除或修改对象时的方法。

    因此,要删除一个对象,只需将其从托管对象上下文中删除即可。 不要打电话给beginUpdatesendUpdatesdeleteRowsAtIndexPathsperformFetch

    -(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath*)indexPath {
        if (editingStyle == UITableViewCellEditingStyleDelete) {
            NSManagedObject *managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath];
            [self.managedObjectContext deleteObject:managedObject];
            [self.managedObjectContext save:nil];
        }
    }
    

    【讨论】:

    • 谢谢!这是解决方案朝着正确方向迈出的一步。现在应用程序没有崩溃,但删除操作后 tableview 没有更新。仅当更改视图并再次返回时,Tableview 才会更新。
    • @user2355509:您是否实现了 NSFetchedResultsControllerDelegate 方法:controllerWillChangeContent、didChangeObject、controllerDidChangeContent,...如文档中所述:developer.apple.com/library/ios/documentation/CoreData/…
    • 很抱歉我对此的不熟练问题:现在我已经在“.h”文件 中实现了。我是否必须手动实现这些方法,并在“if (editingStyle == UITableViewCellEditingStyleDelete) {”中调用它们?
    • @user2355509:您必须实现 .m 文件中的方法。 NSFetchedResultsControllerDelegate 文档有示例代码,可以或多或少地复制到您的表格视图控制器中。
    • 好的,这些方法我也实现了,代码没有错误。但这不会生效。 TableView 仍然没有重新加载,删除操作后,只有在重新加载整个视图之后。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 2017-11-29
    相关资源
    最近更新 更多