Objective-C-iOS UITableView在删除时发生底行崩溃
我正在扩展“今日学习iOS编程”教程,以包括删除功能 我已经修改了Objective-C-iOS UITableView在删除时发生底行崩溃,ios,objective-c,uitableview,Ios,Objective C,Uitableview,我正在扩展“今日学习iOS编程”教程,以包括删除功能 我已经修改了tableView didSelectRowAtIndexPath:方法,因此: - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:NO]; ToDoItem *tappe
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];
}
在具有三行的节中,它按预期工作。点击会产生一个复选标记,点击一个复选标记的项目会将其删除。但是如果我点击底部的一行,它就会崩溃,因为试图从第0节中删除第2行,该节在更新之前只包含2行“
。注意,这是在其他两行仍然存在的情况下发生的(我的搜索发现了许多帖子,其中有人删除最后一行时发生了崩溃——这里不是这种情况)。最下面一行将标记自己刚刚完成
另外请注意,将数组更改调用移出beginUpdate
块会将错误从第2行更改为第3行。。。包含3行。
TIA需要任何帮助
编辑:
我已经通过移动
[tableView reloadRowsAtIndexPaths:@[indexPath]with RowAnimation:UITableViewRowAnimationNone]解决了这个问题代码>在else
块内。有人能解释一下原因吗?如果使用deleteRowsAtIndexPaths
,则尝试重新加载已删除的行没有意义。显然,如果您试图为不再有效的indepath
重新加载单元格,那么您将遇到您描述的那种问题
假设您有10行,您不想有效地说,“删除第十行;现在在一个现在只有9行的表中重新加载第十行。”您可以很容易地想象为什么会出现问题
在这种情况下,您应该删除对reloadRowsAtIndexPaths
的调用。如果某些剩余单元格的内容发生更改,则只需调用reload…
。如果只是插入或删除行,则只需执行该操作,无需调用reloadrowsatindexpath
。numberOfRows方法的外观如何?在indepath
处删除行,然后尝试重新加载相同的indepath
。不要试图重新加载已删除的行。对不起,投票被否决了,我觉得你的解释很合理。谢谢你!别担心。几个月前,有个家伙发布了两个完全无关但明显荒谬的答案,我犯了一个错误,在投票前(非常礼貌地)发布评论,指出错误。(他很有防御性。有一次,当我指出系统完全按照文档记录的方式工作时,他建议我提交一份错误报告,因为它没有按照他认为应该的方式工作。Lol。)从那以后,我注意到每次他获得无法识别的否决票时,我也会收到一张神秘的否决票。我怀疑他认为他得到的每一张反对票都是我投的。真讨厌。