0

当我尝试使用 UITableViewCellEditingStyleDelete 从 UITableView 中删除一行时出现断言失败。希望有人能告诉我我的代码出了什么问题。

*** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-2372/UITableView.m:1070
2013-01-30 14:19:21.450 MyApp[48313:c07] *** 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 (1) 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) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).'
*** First throw call stack:
(0x28ee012 0x1d3fe7e 0x28ede78 0x19fef35 0xf51b8d 0xf5df95 0xf5dfc3 0xcfe9 0xf6c384 0x10a9b1b 0x1d53705 0xeb3920 0xeb38b8 0xf74671 0xf74bcf 0xf746a6 0x1144f95 0x1d53705 0xeb3920 0xeb38b8 0xf74671 0xf74bcf 0xf73d38 0xee333f 0xee3552 0xec13aa 0xeb2cf8 0x2d1adf9 0x2d1aad0 0x2863bf5 0x2863962 0x2894bb6 0x2893f44 0x2893e1b 0x2d197e3 0x2d19668 0xeb065c 0x24fd 0x2435)
libc++abi.dylib: terminate called throwing an exception
(lldb) 

这是我的代码:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [records count];
}

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

        // Delete record from the sqlite database
        NSNumber *recordDBID = [records objectAtIndex:indexPath.row];
        Record *myRecord = [[Record alloc] initWithDBID:recordDBID database:UIAppDelegate.formManager.connection];
        BOOL valueX = [myRecord deleteRecordInDb:recordDBID];
        [myRecord release];

        // Delete record from array
        NSMutableArray *aNewArray = [[NSMutableArray alloc] initWithArray:records];
        [aNewArray removeObjectAtIndex:indexPath.row];
        records = aNewArray;
        [aNewArray release];

        // Delete the record from the table
        [tableView beginUpdates];
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        [tableView endUpdates];
        [tableView reloadData];   
}
4

2 回答 2

0

我认为您可能会使删除表格视图行过于复杂。

不需要打电话[tableView beginUpdates][tableView endUpdates]如果你只想在这两个电话之间删除一行,那么你可能会丢失它们。仅当您要同时执行多个插入或删除操作时才需要开始和结束更新。

其次,[tableView reloadData]此时调用是多余的,因为表视图将使用分配的委托/数据源自动请求作为删除操作的一部分所需的信息。您可以将代码的最后一部分简化为:

// 从表中删除记录

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

可能是当前的行删除代码(结合更广泛的代码库)使系统感到困惑。

如果上述方法没有帮助,我们需要查看records修改数组的所有代码。在这种情况下,我将更新我的答案。

于 2013-01-30T08:16:54.427 回答
0

就我而言,我有错别字:indexPath而是newIndexPathinsertRowsAtIndexPaths

 func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?)
        {
            switch type
            {
            case .Insert:
                self.tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: .Bottom)

            case .Delete:
                self.tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: .None)

            case .Update:
                self.tableView.reloadRowsAtIndexPaths([indexPath!], withRowAnimation: .Fade)

            case .Move:
                    self.tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: .None)
                    self.tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: .Bottom)
                }
        }
于 2015-05-19T07:45:23.727 回答