UICollectionView嵌套UIView中未渲染问题咨询(无弱引用场景)
我太懂这种明明代码看起来没问题,但UICollectionView就是死活不渲染的憋屈感了!既然你已经排除了弱引用的问题,那咱们可以从这些常见的坑入手排查:
约束配置是否完整且正确
这是最容易踩的坑之一!确保你的UICollectionView已经设置了完整的约束:要么和父UIView的上下左右边缘都绑定,要么明确设置了宽高约束。如果约束不完整,CollectionView的frame可能被计算成(0,0,0,0),自然看不到任何内容。你可以通过Xcode的Debug View Hierarchy工具查看它的实际尺寸,一目了然。数据源与代理是否正确赋值
就算没有弱引用问题,也可能漏写了关键的赋值代码:collectionView.dataSource = self collectionView.delegate = self而且要确保这两行是在
viewDidLoad或者合适的时机调用(比如父视图已经加载完成后)。另外,一定要检查数据源方法的返回值:numberOfItemsInSection是否返回了大于0的数值?如果返回0,自然不会有cell显示。cellForItemAt是否正确dequeue了cell?比如复用标识符要和注册的完全一致,而且没有返回nil。
CollectionView布局是否合理
如果用的是UICollectionViewFlowLayout,要确认itemSize设置了有效的宽高(不能是(0,0)),或者实现了collectionView(_:layout:sizeForItemAt:)代理方法返回正确的cell尺寸。另外,也可以给CollectionView设置一个显眼的backgroundColor,有时候内容和背景色一致,会误以为没渲染。父UIView的属性是否正常
检查父UIView有没有被意外设置成hidden = true,或者clipsToBounds = true但自身尺寸不足以容纳CollectionView?还有父视图的alpha是不是被设为0了?这些都会导致子控件无法正常显示。Cell的注册与复用是否正确
如果是代码注册cell,要确保调用了正确的注册方法:collectionView.register(YourCellClass.self, forCellWithReuseIdentifier: "CellID")如果是XIB创建的cell,要注册对应的XIB文件:
collectionView.register(UINib(nibName: "YourCellXIB", bundle: nil), forCellWithReuseIdentifier: "CellID")而且在dequeue的时候,一定要使用和注册时完全相同的复用标识符。
查看控制台的错误/警告日志
Xcode的控制台经常会给出关键线索,比如约束冲突、cell复用失败的警告。比如看到“Could not dequeue a cell with identifier XXX - must register a nib or a class for the identifier or connect a prototype cell in a storyboard”这类提示,直接就能定位到复用的问题。
内容的提问来源于stack exchange,提问作者M T

