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 子类中调用了两次的主要内容,如果未能解决你的问题,请参考以下文章