一次编辑UITableView的多个部分会导致崩溃

时间:2010-08-15 15:30:47

标签: objective-c uitableview uikit

我有一个包含2个部分的UITableView。第0部分包含文件名列表,用户可以点击它们来切换复选标记附件。此部分也是可编辑的,因此用户可以滑动以删除文件/行。第1部分不可编辑,包含1行,并作为启动文件传输的按钮。

因此,表的数据源如下所示:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

switch (section) {
    case SECTION_FILES:
        return [files count];
        break;
    case SECTION_ACTIONS:
        if ([files count]) {
            return 1;       // ROW_ACTIONS_TRANSFER
        return 0;
        break;
}
return 0;

}

我想要的行为是第1部分仅在第0部分有行时显示。我发现的问题是当第0部分中的最后一行被删除时,第1部分仍然包含1行。要删除第1部分中的行,我想我应该在为第0部分中的最后一行提交编辑时调用deleteRowsAtIndexPath或reloadSections,然后将对该单元格进行动画处理。但是,这样做会导致我的应用崩溃说:

  

由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无效更新:第1节中的行数无效。更新后的现有部分中包含的行数(1)必须等于行数在更新(1)之前包含在该部分中,加上或减去从该部分插入或删除的行数(插入0,删除1)。'

我可以在tableview上调用reloadData,但更新是一次大幅重绘,我更喜欢将单元格设置为动画。有没有办法实现我想要的?我觉得这应该很容易,我错过了一些明显的东西。

我的commitEditingStyle代码如下。我首先从我的数据源(文件)中删除,这是推荐的方式,对吗?

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        switch ([indexPath section]) {
            case SECTION_FILES:
                [files removeObjectAtIndex:indexPath.row];
                [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationRight];
                // Here is where I would call [tableView reloadData] or [tableView reloadSection...
                break;
        }

} }

1 个答案:

答案 0 :(得分:0)

我能够自己解决这个问题,但不能像我想的那样优雅。基本上,我所做的是保留一个成员变量来跟踪我是否已将SECTION_ACTIONS插入到tableview中。然后当修改SECTION_FILES时,我做:

[tableview beginUpdates];
[tableview insertSection SECTION_ACTIONS];
self.showingActionsSection = YES;
[tableview endUpdates];

[tableview beginUpdates];
[tableview deleteSection SECTION_ACTIONS];
self.showingActionsSection = NO;
[tableview endUpdates];

幸运的是,这样做可以让我在添加和删除内容时获得更好的平滑动画。但是,它使UITableView数据源的行为与我以前的行为略有不同。