我有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];
}
答案 0 :(得分:2)
通常,您在动画期间禁用用户交互,但由于您需要一个完成处理程序来知道何时重新打开用户交互(表视图批量更新不提供此操作),您可以尝试发布批处理更新块以使表格视图有机会停止搅动:
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView beginUpdates];
//...
[self.tableView endUpdates];
});
通过执行此操作,我解决了因重叠批量更新而导致的崩溃问题。不过,我不得不说,我试图重现你的问题而不能。所以可能还有另一个问题。
如果仍有问题,请考虑使用TLIndexPathTools构建表格。它为您计算并执行批量更新,非常强大。特别针对您的问题,请尝试运行Settings sample project。快速打开和关闭“声音”开关会隐藏并显示一行并且不会崩溃。