deleteRowsAtIndexPaths导致崩溃

时间:2013-07-09 00:39:43

标签: uitableview

我有UISwitch,它在2个表视图状态之间切换。问题是快速切换导致崩溃。我认为这是因为删除行需要一些时间(因为动画),如果我添加了一些单元格,几乎同时尝试删除它们然后崩溃。我能做什么?我真的很想要动画,所以[self.tableView reloadData]不是解决方案。

- (void)switchChangedInIndexPath:(NSIndexPath *)indexPath
{
    EBOrderFormCell *cell = (EBOrderFormCell *)[self.tableView cellForRowAtIndexPath:indexPath];
    BOOL on = cell.picker.on;
    if (indexPath.row == EBOrderFormTakeAway) {
        self.takeAway = on;
        [self takeAwayChanged];
    }
}

- (void)takeAwayChanged
{
    NSArray *notTakeAwayCells = [[NSArray alloc] initWithObjects:
                                    [NSIndexPath indexPathForRow:EBOrderFormStreet inSection:0],
                                    [NSIndexPath indexPathForRow:EBOrderFormHouseNumber inSection:0],
                                    [NSIndexPath indexPathForRow:EBOrderFormFlatNumber inSection:0],
                                    nil];
    NSArray *takeAwayCells = [[NSArray alloc] initWithObjects:
                              [NSIndexPath indexPathForRow:EBOrderFormCafe inSection:0],
                              nil];
    [self.tableView beginUpdates];
    if (self.takeAway) {
        [self.tableView insertRowsAtIndexPaths:takeAwayCells withRowAnimation:UITableViewRowAnimationFade];
        [self.tableView deleteRowsAtIndexPaths:notTakeAwayCells withRowAnimation:UITableViewRowAnimationFade];
    } else {
        [self.tableView insertRowsAtIndexPaths:notTakeAwayCells withRowAnimation:UITableViewRowAnimationFade];
        [self.tableView deleteRowsAtIndexPaths:takeAwayCells withRowAnimation:UITableViewRowAnimationFade];
    }
    [self.tableView endUpdates];
}

更新:使用以下代码修复它:

- (void)takeAwayChanged
{
    [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];
}

1 个答案:

答案 0 :(得分:2)

通常,您在动画期间禁用用户交互,但由于您需要一个完成处理程序来知道何时重新打开用户交互(表视图批量更新不提供此操作),您可以尝试发布批处理更新块以使表格视图有机会停止搅动:

    dispatch_async(dispatch_get_main_queue(), ^{
        [self.tableView beginUpdates];
        //...
        [self.tableView endUpdates];
    });

通过执行此操作,我解决了因重叠批量更新而导致的崩溃问题。不过,我不得不说,我试图重现你的问题而不能。所以可能还有另一个问题。

如果仍有问题,请考虑使用TLIndexPathTools构建表格。它为您计算并执行批量更新,非常强大。特别针对您的问题,请尝试运行Settings sample project。快速打开和关闭“声音”开关会隐藏并显示一行并且不会崩溃。