我正在扩展今日学习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
来修复此问题。有人可以解释原因吗?
答案 0 :(得分:1)
如果您使用deleteRowsAtIndexPaths
,则尝试重新加载您删除的行没有意义。而且,显然,如果您尝试为不再有效的indexPath
重新加载单元格,那么您将遇到您描述的那种问题。
让我们说你有10行,你不想有效地说,"删除第10行;现在重新加载一个表中的第十行,该表现在只有九行。"您可以轻松想象为什么会出现问题。
在这种情况下,您应该完全删除对reloadRowsAtIndexPaths
的调用。如果某些剩余单元格的内容发生变化,您只需调用reload...
即可。如果您只是插入或删除行,那么就这样做,而不需要调用reloadRowsAtIndexPaths
。