ios 单独重新加载单元格时UITableViewCell内容 Flink

vh0rcniy  于 2023-03-14  发布在  iOS
关注(0)|答案(6)|浏览(130)

我有一个链接到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];重新加载整个表视图对我来说不是一个选项。

其他更多信息

  • 使细胞不透明导致细胞只排列一次!奇怪!

最后,很抱歉我不能分享任何实际的代码,因为它不是一个测试项目,实现的复杂性使得任何代码共享都是徒劳的,除非作为一个整体来理解。
谢谢你的时间。

9ceoxa92

9ceoxa921#

我也遇到了同样的问题,在使用reloadRowsAtIndexPath时UITableViewCell Flink ,所以我做了-

[UIView setAnimationsEnabled:NO];
     [self.tableView beginUpdates];

     [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil]
                                               withRowAnimation:UITableViewRowAnimationNone];
     [self.tableView endUpdates];
     [UIView setAnimationsEnabled:YES];

在重新加载单元格时,上面的代码段将不会在单元格上显示动画。

hc8w905p

hc8w905p2#

是的,您可以使用performWithoutAnimation(Swift版本)从@桑迪的答案中获得类似的结果

UIView.performWithoutAnimation {
      self.tableView.reloadRows(at: [indexPath], with: .none)
}
js4nwp54

js4nwp543#

如果有人遇到同样的问题:
如果你正在计算你的单元格高度和它的元素,并且你依赖于NSIndexPath来查询任何数据或条件,总是检查你的索引路径是否有效(不是nil)。大多数返回索引路径的UITableView方法(例如-(NSIndexPath *)indexPathForCell:..等)可能返回nil值,并且会让你陷入调试视图的漩涡。
在我的例子中,我有一个方法来确定单元格是否应该有标头,为此,我检查了它是第一个单元格还是自上一个单元格以来条件已更改。问题是即使索引路径实际上是nilindexPath.row == 0也为真(这是Objective-C中的一个概念性问题,其中nil是0)。因此,有那么一会儿,我的细胞会认为它有一个头部!
我觉得不检查nil索引路径有点愚蠢,但我认为共享它可能会在某一天对某些人有所帮助。

g0czyy6m

g0czyy6m4#

在swift中我使用了这个,它减少了 Flink

let visibleIndexs = self.ContentTableview.indexPathsForVisibleRows! as NSArray
        print(visibleIndexs)
        for indx in visibleIndexs {
            if self.imgDownloadedIndexs!.containsObject(indx) {
                  UIView.setAnimationsEnabled(false)
                self.ContentTableview.beginUpdates()
                self.ContentTableview.reloadRowsAtIndexPaths([indx as! NSIndexPath], withRowAnimation:.None)
                self.ContentTableview.endUpdates()
                 UIView.setAnimationsEnabled(true)
                self.imgDownloadedIndexs?.removeObject(indx)

            }
2uluyalo

2uluyalo5#

删除rowHeightAtIndexPath方法将解决此问题。请确保您已为故事板中的表格单元格设置了一些固定高度。

v64noz0r

v64noz0r6#

tableView自定义单元格不可点击且 Flink 。这是由于单元格动画所致。请检查TableView委托方法以访问数据库。
这种情况通常会发生,也可能在运行UITestCase时发生。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

return cell
}

函数表格视图(_表格视图:UITableView,在索引处选择行路径:索引路径){ }

相关问题