2

我有 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];
}
4

1 回答 1

2

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

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

通过这样做,我已经解决了由重叠批量更新引起的崩溃。不过,我不得不说,我试图重现您的问题,但不能。所以可能还有另一个问题。

如果您仍然遇到问题,请考虑使用TLIndexPathTools构建您的表。它为您计算并执行批量更新,并且非常强大。具体到您的问题,请尝试运行设置示例项目。快速打开和关闭“声音”开关会隐藏并显示一行并且不会崩溃。

于 2013-07-09T02:22:32.330 回答