如何删除部分的最后一行?

时间:2009-06-16 07:01:37

标签: iphone cocoa-touch uikit uitableview

这个问题让我在最后几个小时都很忙。我有两个部分,每个部分有一行。当我删除其中一个部分中的行时,它会抛出一个异常,说这是一个无效的更新(更新前后的行/部分数不相同)。这是可以理解的,因为我删除了一节的最后一行,因此我删除了该节。问题是如何避免例外。

我的数据源一切正常。我检查并重新检查(相信我)。

因此,正如线程的标题所述,如何删除某个部分的最后一行而不会出现异常?

谢谢,

巴特

5 个答案:

答案 0 :(得分:27)

删除行时,此行是其中的最后一行,您还需要删除该部分。基本上,您需要跟踪要删除的indexPaths(与行关联的索引)以及与需要删除的部分相关的索引,因为它们不再包含行。你可以这样做:

NSMutableIndexSet *indexes = [NSMutableIndexSet indexSet];

每次从模型数组中删除与tableView的特定部分相关的对象时,检查数组计数是否为零,在这种情况下,向索引添加表示该部分的索引:

[array removeObjectAtIndex:indexPath.row];
if(![array count])
    [indexes addIndex: indexPath.section];

确定与要删除的行相关的所有indexPath,然后按如下所示更新tableView:

[tableView beginUpdates];
[tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade];
[tableView deleteSections:indexes withRowAnimation:UITableViewRowAnimationFade];
[tableView endUpdates];

这对我和其他人有用,我建议采用这种方法。

答案 1 :(得分:1)

也许这对你有用:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    NSUInteger section = [indexPath section];
    NSUInteger row = [indexPath row];

    NSString *key = [self.keys objectAtIndex:section];
    NSMutableArray *rowsInSection = [self.dict objectForKey:key];
    [rowsInSection removeObjectAtIndex:row];

    NSUInteger rowsInSectionCount = [rowsInSection count];

    if (rowsInSectionCount > 0) {
        // If we still have rows in this section just delete the row
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }
    else {
        // There are no more rows in this section
        [self.dict removeObjectForKey:key];
        [self.keys removeObjectAtIndex:section];

        NSUInteger sectionCount = [self.keys count];

        if (sectionCount > 0) {
            // If we still have 1 or more sections left just delete this section
            [tableView deleteSections:[NSIndexSet indexSetWithIndex:section] withRowAnimation:UITableViewRowAnimationFade];
        }
        else {
            // If there are no more rows and sections left just delete the last row
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            [tableView reloadData];
        }
    }
}

希望这就是你要找的东西。

答案 2 :(得分:1)

这个应该可以解决问题:

    // Either delete some rows within a section (leaving at least one) or the entire section.
    if ([indexPath section] < 0) {
        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    } else if ([indexPath section] == 0) {
        [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:[indexPath section]] withRowAnimation:UITableViewRowAnimationFade];
    }

答案 3 :(得分:1)

对于Swift 2,删除模型中的数据后:

add = add + add + add

答案 4 :(得分:0)

要删除某节的最后一行,则由于没有更多行,因此需要删除该节。

当您使用Tableview实现NSFetchedResultsController并利用NSFetchedResultsController的功能与TableView的部分,行以及添加/删除/移动功能一起使用时,这尤其重要。

    func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
    switch type {
        case .delete:
            if tableView.numberOfRows(inSection: indexPath!.section) > 1 {
                    tableView.deleteRows(at: [indexPath!], with: .automatic)
            } else {
                let section = indexPath!.section
                let indexSet = IndexSet(integer: section)
                //tableView.deleteRows(at: [indexPath!], with: .automatic)
                tableView.deleteSections(indexSet, with: .automatic)
            }
        default:
        break
    }
}