Objective-C - 删除iOS UITableView底行崩溃

时间:2014-12-01 15:04:02

标签: ios objective-c uitableview

我正在扩展今日学习iOS编程教程以包含删除功能。

我已经修改了tableView didSelectRowAtIndexPath:方法:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    [tableView deselectRowAtIndexPath:indexPath animated:NO];
    ToDoItem *tappedItem = [self.toDoItems objectAtIndex:indexPath.row];
    if (tappedItem.completed) {

        [tableView beginUpdates];
        [self.toDoItems removeObjectAtIndex:indexPath.row];

        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationBottom];
        [tableView endUpdates];

    } else {
        tappedItem.completed = YES;
    }
    [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
}

在包含三行的部分中,它按预期工作。点击产生一个复选标记,点击一个勾选标记的项目将其删除。但如果我点击底行,它会与'attempt to delete row 2 from section 0 which only contains 2 rows before the update'崩溃。请注意,当其他两行仍在那里时会发生这种情况(我的搜索发现了许多帖子,当有人删除了最后一行时发生了崩溃 - 而不是这里的情况)。底行将标记为完成正常。

另请注意,将数组更改调用移出beginUpdates块会将错误从第2行更改为row 3 ... contains 3 rows.

TIA提供任何帮助。

编辑:

我已通过在[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];块内移动else来修复此问题。有人可以解释原因吗?

1 个答案:

答案 0 :(得分:1)

如果您使用deleteRowsAtIndexPaths,则尝试重新加载您删除的行没有意义。而且,显然,如果您尝试为不再有效的indexPath重新加载单元格,那么您将遇到您描述的那种问题。

让我们说你有10行,你不想有效地说,"删除第10行;现在重新加载一个表中的第十行,该表现在只有九行。"您可以轻松想象为什么会出现问题。

在这种情况下,您应该完全删除对reloadRowsAtIndexPaths的调用。如果某些剩余单元格的内容发生变化,您只需调用reload...即可。如果您只是插入或删除行,那么就这样做,而不需要调用reloadRowsAtIndexPaths