当我使用commitEditingStyle从UITableView删除一行时,我的应用程序崩溃并显示以下错误消息。奇怪的是,我正在删除第3节。根据消息显示的不一致来自第4节。


  *-[UITableView _endCellAnimationsWithContext:],/ SourceCache / UIKit_Sim / UIKit-1262.60.3 / UITableView.m:920中的断言失败
  2010-11-22 19:56:44.789 bCab [23049:207] *由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无效的更新:第4节中的行数无效。现有节中包含的行数更新之后(1)必须等于更新(0)之前该节中包含的行数,加上或减去从该节中插入或删除的行数(已插入0,已删除0)。


在数据源中,我根据第3节中的行数更新第4节。当从第3节中删除一行时,第4节中的行数从0变为1。这似乎引起了问题。有没有办法避免这种情况?

任何指针将不胜感激。
谢谢。

更新:

numberOfSectionsInTableView
    -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        返回6;
    }

numberOfRowsInSection

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
bCabAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

    if (section == 0) {        // First name, last name
        return 2;
    }
    else if (section == 1) {   // Password
        return 2;
    }
    else if (section == 2) {   // Mobile, DOB , Gender
        return 3;
    }
    else if (section == 3) {    // credit cards
        return [creditCards count];
    }
    else if (section == 4) {    // Add credit card
        if ([creditCards count] >= 3) {
            return 0;
        }
        else {
            return 1;
        }
    }
    else if (section == 5) {
        return 0;
    }

    return 0;


}

commitEditingStyle

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        if (indexPath.section == 3) {
        // Delete the row from the data source
        NSLog(@"%d %d", indexPath.section, indexPath.row);
        [creditCards removeObjectAtIndex:indexPath.row];

        // Delete from backend

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

        //[tableView reloadData];
        }
    }
    else if (editingStyle == UITableViewCellEditingStyleInsert) {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
    }


}

我尝试过使用[tableView reloadData]和不使用它都具有相同的结果。

感谢您的帮助!

最佳答案

在数据源中,我更新了第4节
  取决于中的行数
  第3部分。
  第3节,第4节中的行数
  从0到1。这似乎导致
  问题。有没有办法避免
  这个?


使用deleteRowsAtIndexPaths:withAnimation时,您保证数据源将只删除具有指定索引路径的行。在您的情况下,您还将在表中插入一行,这意味着数据源的状态不是表视图所期望的。

当删除第3节中的一行(还涉及在第4节中插入一行)时,您必须执行以下操作:

[self.tableView beginUpdates];
[self.tableView [NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[self.tableView insertRowsAtIndexPath:[NSArray arrayWithObject:indexPathForInsertedRow] withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];

关于iphone - 删除行时崩溃-未更新节中的不一致,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4243834/

10-10 20:33