重新加载节索引时出现奇怪的错误?
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
方法beginUpdates
、insertRowsAtIndexPaths: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”错误