Xcode 9.2、Swift 4下UICollectionViewController单元格不显示求助
这种情况我之前开发时也遇到过,通常是几个关键配置没到位,咱们逐个排查:
确认数据源方法是否完整实现
CollectionView要显示单元格,必须实现UICollectionViewDataSource的两个核心方法:numberOfItemsInSection(_:):这个方法的返回值必须大于0,否则不会生成任何单元格;cellForItemAt(_:):要确保在这个方法里正确复用单元格,比如代码里要写:
同时要保证你的CollectionViewController类已经遵守了let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "TextCell", for: indexPath) // 如果有自定义内容,这里可以设置cell的属性 return cellUICollectionViewDataSource协议。
检查单元格复用标识符是否匹配
确认storyboard中单元格的Reuse Identifier确实是TextCell,和你在cellForItemAt(_:)里使用的标识符完全一致(大小写敏感)。验证CollectionView的布局设置
如果用的是默认的Flow Layout,检查布局的Item Size是否设置合理:如果宽高设得太小(比如0),或者section insets、minimum spacing把单元格挤到显示区域外,都会导致看不到单元格。你可以在storyboard中选中Flow Layout,在Attributes Inspector里调整这些参数,或者在代码里动态设置:if let flowLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout { flowLayout.itemSize = CGSize(width: 100, height: 100) flowLayout.minimumInteritemSpacing = 10 flowLayout.minimumLineSpacing = 10 }确认数据源与代理的关联
即使你把CollectionViewController和storyboard场景关联了,也可能出现dataSource或delegate未正确设置的情况:- 在storyboard中选中CollectionView,打开Connections Inspector,检查
dataSource和delegate是否连接到了当前的CollectionViewController; - 或者在
viewDidLoad()方法里手动设置:override func viewDidLoad() { super.viewDidLoad() collectionView.dataSource = self collectionView.delegate = self }
- 在storyboard中选中CollectionView,打开Connections Inspector,检查
检查CollectionView的约束与Frame
确保CollectionView的约束是正确的,它的frame没有被设置为CGRect.zero,也没有被其他视图遮挡。在storyboard中选中CollectionView,查看它的约束是否覆盖了整个父视图(比如leading、trailing、top、bottom都绑定到父视图)。
你可以按照这个顺序排查,应该能快速找到问题所在~
内容的提问来源于stack exchange,提问作者TmSmth

