在屏幕上查看可见但 didMoveToWindow: etc 从不调用
Posted
技术标签:
【中文标题】在屏幕上查看可见但 didMoveToWindow: etc 从不调用【英文标题】:View Visible on Screen but didMoveToWindow: etc Never Called 【发布时间】:2017-05-20 05:03:23 【问题描述】:我正在使用didMoveToWindow:
来触发带有自定义 UICollectionViewCell 的动画。奇怪的是...对于第一个和第二个单元格,动画效果很好(并且所有应该调用的方法都被调用)...
...对于第 3 个单元格,它会显示出来,但不会为第 3 个单元格调用 didMoveToWindow:
、willMoveToWindow:
、didMoveToSuperview:
和 willMoveToSuperview:
。我什至尝试过drawRect:
,但它也从未被调用...
我不明白如何在不调用 drawRect:
的情况下在屏幕上绘制它。
在drawRect:
我只是打印到日志,然后调用super实现。即使从未调用/打印日志消息,这样做确实会使背景变黑(通常它是透明的)。所以那一定是……做了什么……?
每个单元格出现在该位置周围,然后被移动到位。背景表示 UICollectionView 的框架.. 显示一切都在边界内。
更新:
我尝试使用didAddSubview:
,但同样的事情......它只在前两个单元格中调用过。但是,当插入第 3 个单元格并重新加载第 2 个单元格并为第 2 个单元格调用 didAddSubview:
时...集合视图的可见单元格计数为 3。
更新2:
当我通过 Xcode 检查视图层次结构时,它会将所有 3 个单元格显示为集合的子视图......但不知何故,它只为前两个调用 addSubview:
didAddSubview:
.. 奇怪
【问题讨论】:
tableviewcell 可以重复使用,如果它已经显示didMoveToWindow:
或 willMoveToWindow
将不会被调用,因为它已经被添加了。
对不起,我应该添加。我看着它创建了第三个对象。 initWithFrame:
在第三个单元格上,cellForItemAtIndexPath:
在集合上。还有就是屏幕上同时有 3 个单元格,至少要有 3 个单元格。
是的,我也错过了...所有 3 个单元格都在屏幕上..
也许您可以尝试将动画代码放在 cellForRow where (cell==nil) 中?
@GeneCode 我正在考虑在cellForItemAtIndexPath:
之后启动一个计时器,并轮询可见的单元格计数,然后当它添加到该数组时...启动动画(因为我无法观察到该计数以任何方式)。
【参考方案1】:
这几天忙于其他工作,昨晚又回到这个问题......神奇地这个错误消失了! (在我做了一些意外的重构之后)。
在我执行“performBatchUpdates:”之前,我 1) 重新加载了前一个单元格,2) 插入了新单元格。当我这样做时,从未在插入的单元格上调用视图生命周期事件(从第 3 个单元格开始)。
当我切换到手动重新加载前一个单元格的视图时(只是更改掩码视图,所以没有理由正式重新加载单元格),通过使用“cellForItemAtIndexPath:”捕获它,并且只在执行批量更新中执行插入...我现在收到插入单元格的所有正确视图生命周期事件。
所以错误就在那里。
【讨论】:
以上是关于在屏幕上查看可见但 didMoveToWindow: etc 从不调用的主要内容,如果未能解决你的问题,请参考以下文章
Flutter:检测任何在屏幕上不可见但在小部件树中的小部件的重建