从UITableView删除部分时出现异常

时间:2011-07-22 07:18:25

标签: iphone uitableview

我在运行时填充了一个tableview。我为它设置了一个编辑选项,我可以从中删除部分。部分数取决于数组,部分中只有一行。

问题:

当我点击删除按钮时,我在日志中收到一个例外情况:

  

断言失败 - [UITableView _endCellAnimationsWithContext:],/ SourceCache / UIKit_Sim / UIKit-1448.89 / UITableView.m:974

commitEditingStyle:

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

    if (editingStyle == UITableViewCellEditingStyleDelete) {
       // [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES];

        Customer *objCustomer = [arrCustomerList objectAtIndex:indexPath.section];
        NSString *strCusID = [objCustomer customerID];
        CustomerModel *objCustomerModel = [[CustomerModel alloc]init];
        [objCustomerModel deleteCustomer:strCusID];
       [tableView beginUpdates];
            [tableView deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationLeft];

        [tableView endUpdates];
        [tableView reloadData];

    }   
}  

2 个答案:

答案 0 :(得分:2)

您可以尝试将beginUpdates电话放在开头,

if (editingStyle == UITableViewCellEditingStyleDelete) {
    [tableView beginUpdates];
    Customer *objCustomer = [arrCustomerList objectAtIndex:indexPath.section];
    NSString *strCusID = [objCustomer customerID];
    CustomerModel *objCustomerModel = [[CustomerModel alloc]init];
    [objCustomerModel deleteCustomer:strCusID];
    [tableView deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section]
             withRowAnimation:UITableViewRowAnimationLeft];
    [tableView endUpdates];
    [tableView reloadData];
}

因为插入/删除/更新操作必须放在beginUpdatesendUpdates之间。

这是Apple doc:

  

如果您未在内部进行插入,删除和选择调用   此块,行计数等表属性可能无效。

此外,如果相关部分是最后一部分,请确保您仍然返回1作为部分数量。在这种情况下,仍然为部分数返回1并返回0作为行数。

答案 1 :(得分:0)

幸运的是我找到了解决问题的方法。以下是我用来摆脱问题的代码:

Customer *objCustomer = [arrCustomerList objectAtIndex:indexPath.section];
NSString *strCusID = [objCustomer customerID];
CustomerModel *objCustomerModel = [[CustomerModel alloc]init];
[objCustomerModel deleteCustomer:strCusID];
[arrCustomerList removeObject:objCustomer];
[tableView reloadData];