awakeFromNib() 在滚动开始时在 UICollectionViewCell 子类中调用了两次

Posted

技术标签:

【中文标题】awakeFromNib() 在滚动开始时在 UICollectionViewCell 子类中调用了两次【英文标题】:awakeFromNib() called twice in UICollectionViewCell subclass at scroll start 【发布时间】:2017-03-24 09:53:27 【问题描述】:

我在 xib 中有自定义 UICollectionViewCell。 当 ViewController 被加载时 - awakeFromNib() 在单元格子类中调用了 6 次(屏幕最初放置了 6 个单元格,好的),但是当我开始滚动时,awakeFromNib() 被调用了六次,导致延迟。但是在此“重新加载”之后,滚动开始顺利进行。这仅在滚动开始时第一次发生。显然,dequeueReusableCell 被使用了。使用UITableView 代替收集,情况类似。 感觉接下来的 6 个单元格再次从 xib 加载(在仅 100 多个单元格的集合中),忽略重用。 可能是什么问题?

为了清楚起见:

UIColectionView 具有垂直滚动方向,两个单元格在一行中。当 ViewController 加载时,我在屏幕上看到 6 个单元格,在控制台中看到 6 个 awakeFromNib 调用。

我开始向下滚动到 7-8 个单元格,在它们出现在屏幕上之前,我看到了滞后和 2 次 awakeFromNib 方法的调用。

对于以下两对单元格也是如此。

在此滚动开始后正常工作,直到单元格 99-100+,并且永远不会调用 awakeFromNib。

添加: 好的,这就是我发现的:

我在 collectionView 中有一个子视图(标题类似于 UITableView),因此,collectionViewLayout 设置 sectionInsets top = 标题的高度。如果我删除标题,并制作顶部插图,例如:-180(大约不包括 NavigationBar 的高度,因此屏幕最初适合 12 个单元格并且滚动滞后消失了。

即,系统需要从 xib 加载所有在屏幕上一次性可见的单元格,并在将来重用它们。 (但为什么不一次加载 xib 并立即将其重用于所有其他初始单元格?)

现在的问题 - 如何解决它?

已添加。2

可行的解决方案 - 在 ViewController 的 viewDidAppear 方法中添加标题,但这...嗯..不好。

【问题讨论】:

【参考方案1】:

这实际上是 UICollectionView 和 UITableView 的已知副作用(或有目的的设计?)。这是一个相关的问题(谈论NSTableView,但概念/问题是相同的):

awakeFromNib method called multiple times

您的集合视图最初显示六个单元格,但听起来 ios 正在分配另外六个单元格以允许左右滚动。所以内存中至少有 12 个(可重复使用的)单元。

如果您在awakeFromNib 中做了大量工作(这是造成延迟的原因),您可能想尝试确定如何优化。

您还可以在此相关问题中找到一些其他有用的提示:

UITableViewCell - Best place to set up the cell

【讨论】:

如果我注释掉 awakeFromNib() 方法 - 滚动开始时的滞后仍然会。这意味着再次加载.xib?但为什么呢? 您的 UICollectionViewCell 和 UITableViewCell 的十几个副本正在被实例化,以便能够正确滚动和填充集合视图和表格视图的可见部分。您应该尝试找出您的单元子类中的滞后来自何处。我建议使用Xcode's Time Profiler instrument。这是一个教程:raywenderlich.com/97886/… 但是这些副本必须在控制器加载时初始化,而不是作为滚动的开始?看起来很疯狂。我看到awakeFromNib 方法的调用仅在屏幕上显示接下来的 6 个单元格 (7-12) 时,此时,当我看到 awakeFromNib 调用时 - 滚动滞后,在旧 ipad 2 上很好看,当滚动停止之前下一对单元格开始可见。当in will 出现在屏幕上后,12 个单元格开始向各个方向顺利滚动,并且不再调用awakeFromNib。此时在顶部的仪器中 - cellForItemAtIndexPath p.s:对不起我的英语 为清楚起见:UIColectionView 具有垂直滚动方向,两个单元格在一行中。当 ViewController 加载时,我在屏幕上看到 6 个单元格,在控制台中看到 6 个 awakeFromNib 调用。我开始向下滚动到 7-8 个单元格,在它们出现在屏幕上之前,我看到了滞后和 2 个电话 awakeFromNib。对于以下两对单元格也是如此。在此滚动开始后正常工作,直到单元格 98-100+,并且永远不会调用 awakeFromNib 这听起来越来越不像 awakeFromNib 的问题,而更像是您如何配置和设置单元格的问题。在您的问题中显示一些代码可能值得吗?例如你的cellForItemAtIndexPath: ?

以上是关于awakeFromNib() 在滚动开始时在 UICollectionViewCell 子类中调用了两次的主要内容,如果未能解决你的问题,请参考以下文章

awakeFromNib() 不适用于模拟指标

如何制作滚动视图,滚动iOS时在特定页面中滚动

使用溢出时在移动/ios上滚动缓慢:滚动

UITableView 在滚动时在顶部插入部分

如何在运行时在垂直可滚动页面内动态创建水平可滚动 Gridview

拖动项目时在列表视图上创建自动滚动