iOS 探讨之 cellForRow/cellForItemAtIndexPath 函数不执行 - Go语言中文社区

iOS 探讨之 cellForRow/cellForItemAtIndexPath 函数不执行


阐述
日常开发中总能遇见一些奇葩的状况,事后发现都是因一些“小忘记”而产生,不过有一些是挺奇葩的。
估计大家刚看标题 "cellForRow/cellForItemAtIndexPath函数不执行" 第一反应就是数据源(dataSource)未设置或者是数据源中的数据总量为零。
大家的反应都是合理的,但我今天想提出的情景是当视图尺寸(Size)宽(width)或高(height)为零的时候表视图(这里统称UITableView、UICollectionView)也不执行上述方法。

探讨
大家都知道无论是 UITableView 或是 UICollectionView 对单元格展示这部分都添加了优化逻辑。
也就是说表视图会实时根据当前界面的信息动态展示单元格Cell。
由“界面的信息”反向推理我们可以得到个假设:
当界面不存在或者不足以显示任何单元格的时候,表视图的展示逻辑会”优化”掉后面费力不讨好的工作 — cellForRow/cellForItemAtIndexPath 函数。

验证
以UITableView为例,我们先正常的展示UITableView,并在 tableView:cellForRowAtIndexPath: 加入断点,查看执行到此的任务栈。


由任务栈信息中我们发现 tableView:cellForRowAtIndexPath: 的前置任务。
#1    0x000000018f39dd90 in -[UITableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:] ()
#2    0x000000018f39dfa8 in -[UITableView _createPreparedCellForGlobalRow:willDisplay:] ()
#3    0x000000018f38b6ac in -[UITableView _updateVisibleCellsNow:isRecursive:] ()
#4    0x000000018f3a2f98 in -[UITableView _performWithCachedTraitCollection:] ()

出于职业的敏感性以及外国朋友那种直接的态度,感觉visible这个单词跟我们的假设相关, #3 的任务可以直译为更新可见区域的单元格。

在Xcode中加入 #3 #4 任务对应的系统断点,并将宽或高设置为零,查看是否执行到对应断点。

结果…  根本执行不到 #4 任务… !

看来猜测是对的

结论
表视图的尺寸(Size) 对 cellForRow/cellForItemAtIndexPath 执行是有一定影响的。

下面概括一下关于 UITableView 的 tableView:cellForRowAtIndexPath:  以及关于 UICollectionView 的 collectionView:cellForItemAtIndexPath: 不执行的情况:
1   数据源dataSource未设置
2  数据源中的数据为空
3  表视图尺寸Size中 width/height 为零
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/yanglei3kyou/article/details/79206661
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2019-09-05 17:56:11
  • 阅读 ( 1758 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢