Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-C-iOS UITableView在删除时发生底行崩溃_Ios_Objective C_Uitableview - Fatal编程技术网

Objective-C-iOS UITableView在删除时发生底行崩溃

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

我正在扩展“今日学习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];
}
在具有三行的节中,它按预期工作。点击会产生一个复选标记,点击一个复选标记的项目会将其删除。但是如果我点击底部的一行,它就会崩溃,因为
试图从第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。)从那以后,我注意到每次他获得无法识别的否决票时,我也会收到一张神秘的否决票。我怀疑他认为他得到的每一张反对票都是我投的。真讨厌。