我有一个链接到NSFetchedResultController
的表视图(即加载数据和跟踪数据更改都绑定到FRC)
我没有在我的单元格中使用AutoLayout
(由于它在iOS 8中引入了巨大的性能下降)。我在单元格中手动布局我的单元格内容(使用-(void)layoutSubviews
)。另外,行高是根据内容计算的,并正确缓存/无效。
如果与我的数据相关的任何条件发生更改,相关单元格将单独更新(实现整个-(void)controllerWillChangeContent:...
到-(void)controllerDidChangeContent:...
委托方法)行更新的动画为:UITableViewRowAnimationNone
这里的问题是,我的细胞有透明的背景,我可以看到一些视觉噪音(最有可能的实际细胞得到垂直拉伸,我不能肯定,因为他们真的是 transient 和短暂的)在[self.tableView reloadRowsAtIndexPaths:...];
。
我试过很多方法都没用!
以下是我尝试过的不起作用的事情:
- 执行
-(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
,返回估计高度的精确值。 - 设置
self.tableView.rowHeight=UITableViewAutomaticDimension;
,帮助很大,但不能修复它。 - 在
[self.tableView beginUpdates];
上禁用动画,在[self.tableView endUpdates];
之后启用 - 正在从
-(void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
中的单元格内容中删除所有子视图
有帮助的事情:
- 使单元格不透明(即设置单元格的背景颜色)。奇怪的是,伪像似乎在实际的单元格内容之下。
更多信息
- 我的大多数单元格的内容都是来自AsyncDisplayKit(ASTextNode,ASImageNode)的节点,但是将它们替换为对应的
UIKit
节点并不能解决问题。 - 我所有的视觉更新都是在主线程上进行的。我总是确保这一点。
- 这个问题并不是普遍存在的,但往往存在。如果有帮助的话,它们似乎更多地发生在第二个细胞插入后。
- 在我的单元格中记录方法
-(void)layoutSubviews
显示,具有更新条件的单元格在每次更新时会连续重新加载3次,而其他单元格只更新一次。 - 使用
[self.tableView reloadData];
重新加载整个表视图对我来说不是一个选项。
其他更多信息
- 使细胞不透明导致细胞只排列一次!奇怪!
最后,很抱歉我不能分享任何实际的代码,因为它不是一个测试项目,实现的复杂性使得任何代码共享都是徒劳的,除非作为一个整体来理解。
谢谢你的时间。
6条答案
按热度按时间9ceoxa921#
我也遇到了同样的问题,在使用reloadRowsAtIndexPath时UITableViewCell Flink ,所以我做了-
在重新加载单元格时,上面的代码段将不会在单元格上显示动画。
hc8w905p2#
是的,您可以使用
performWithoutAnimation
(Swift版本)从@桑迪的答案中获得类似的结果js4nwp543#
如果有人遇到同样的问题:
如果你正在计算你的单元格高度和它的元素,并且你依赖于
NSIndexPath
来查询任何数据或条件,总是检查你的索引路径是否有效(不是nil
)。大多数返回索引路径的UITableView
方法(例如-(NSIndexPath *)indexPathForCell:..
等)可能返回nil
值,并且会让你陷入调试视图的漩涡。在我的例子中,我有一个方法来确定单元格是否应该有标头,为此,我检查了它是第一个单元格还是自上一个单元格以来条件已更改。问题是即使索引路径实际上是
nil
,indexPath.row == 0
也为真(这是Objective-C中的一个概念性问题,其中nil
是0)。因此,有那么一会儿,我的细胞会认为它有一个头部!我觉得不检查
nil
索引路径有点愚蠢,但我认为共享它可能会在某一天对某些人有所帮助。g0czyy6m4#
在swift中我使用了这个,它减少了 Flink
2uluyalo5#
删除rowHeightAtIndexPath方法将解决此问题。请确保您已为故事板中的表格单元格设置了一些固定高度。
v64noz0r6#
tableView自定义单元格不可点击且 Flink 。这是由于单元格动画所致。请检查TableView委托方法以访问数据库。
这种情况通常会发生,也可能在运行UITestCase时发生。
函数表格视图(_表格视图:UITableView,在索引处选择行路径:索引路径){ }