重新加载节索引时出现奇怪的错误?

Posted

技术标签:

【中文标题】重新加载节索引时出现奇怪的错误?【英文标题】:Getting strange error when reloading section index? 【发布时间】:2010-01-08 08:09:16 【问题描述】:

我正在使用 iPhone SDK 和 Objective-C 和 我收到此错误消息:

-[UITableView _endCellAnimationsWithContext:] 中的断言失败,/SourceCache/UIKit/UIKit-984.38/UITableView.m:774 2010-01-08 13:24:16.842 MyAPP [628:20b] 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效更新:第 1 节中的行数无效。之后现有节中包含的行数更新 (1) 必须等于更新之前该节中包含的行数 (0),加上或减去从该节插入或删除的行数(0 插入,0 删除)。

这是我扩展部分的代码:

- (void)checkAction:(id)sender

    //The button is added as subview on a view and the view is section header custom view
    UIButton *Button = (UIButton*)sender;
    NSLog(@"Button Tag=%d",Button.tag);
    if([[self.MySectionIndexArray objectAtIndex:Button.tag] isEqualToString:@"UP"])
    
        [self.MySectionIndexArray replaceObjectAtIndex:Button.tag withObject:@"DOWN"];
        [ButtonDrop setBackgroundImage:[UIImage imageNamed:@"Up.png"] forState:UIControlStateNormal];
        [TableDashBoard reloadSections:[NSIndexSet indexSetWithIndex:Button.tag] withRowAnimation:UITableViewRowAnimationFade];
    
    else
    
        [self.MySectionIndexArray replaceObjectAtIndex:Button.tag withObject:@"UP"];
        [ButtonDrop setBackgroundImage:[UIImage imageNamed:@"Down.png"] forState:UIControlStateNormal];
    
    NSLog(@"self.MySectionIndexArray ka title = %@ at index Number=%d",self.MySectionIndexArray,Button.tag);

【问题讨论】:

【参考方案1】:

问题是因为您在更改表的dataSource 内容时使用reloadSections,因此它通过tableView:numberOfRowsInSection: 报告不同数量的行。

检查您从UITableViewDataSource tableView:numberOfRowsInSection: 返回的内容。我敢打赌,一开始你为第 1 部分返回 0,但当你调用 reloadSections 时,你为第 1 部分返回 1。

如果确实如此,可以使用UITableView方法beginUpdatesinsertRowsAtIndexPaths:withRowAnimation:endUpdates

【讨论】:

我没有更改数据源。实际上,如果我使用 reloaddata,则不会出现错误。我正在使用来自***帖子的扩展部分代码。但我在这里也遇到了另一个奇怪的问题。我从Interface Builder创建了两个自定义单元格。我想在两个单元格下方显示分隔符,所以我给它们添加了一个灰色标签。现在开始我的表格视图在第一部分我为第一行分配一个 IB 单元格,再为 3 行分配另一个 IB 单元格。对于其余部分分配默认单元格。但是当我向下滚动时,灰色标签转换为白色你有什么相关的吗到这个? 我的意思是您正在更改 dataSource内容 - 即您从 tableView:numberOfRowsInSection: 返回的内容 - 这是您的错误消息直接表示的有。 顺便说一句,reloadData 工作的事实表明我们正在尝试查看tableView:numberOfRowsInSection: 返回的内容。这是因为调用reloadSections“导致表格视图向其数据源询问指定部分的新单元格。表格视图动画插入新单元格,因为它动画旧单元格。”并且 reloadData 只是在没有任何动画的情况下重新加载数据,并且“不应在插入或删除行的方法中调用,尤其是在通过调用 beginUpdates 和 endUpdates 实现的动画块中” @AdamWoś 你在这里的详细解释让我意识到我做错了什么,谢谢你!当表格视图期望在动画发生之前发生更新时,我没有意识到完全不同的部分会导致问题。【参考方案2】:

我遇到了类似的问题。我确信正在更新数据源。

但最后我意识到我实际上是在修改 2 个部分,但只更新了一个部分的 dataSource。

【讨论】:

在一种特殊情况下,将部分重新加载链接到 KVO 时,重要的是在重新加载一个部分时,只有该单个部分的行数会发生变化。如果发生影响多个部分的行数的情况,则所有更改的内容都应传递给[reloadSections:withRowAnimation]

以上是关于重新加载节索引时出现奇怪的错误?的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 对象的 Kotlin 中设置属性时出现奇怪的“无法重新分配 Val”错误

在 Java 对象的 Kotlin 中设置属性时出现奇怪的“无法重新分配 Val”错误

Android:执行时出现“无法重新加载 AVD 列表:”错误

尝试重新加载嵌入式 iframe 时出现 CORS 错误

重新加载表数据时出现致命错误:展开为零:需要帮助

使用 vue3 路由重新加载页面时出现错误 404