UICollectionView未显示问题:cellForItemAt与numberOfItemsInSection方法未触发
解决你的UICollectionView无数据加载问题
嘿,我仔细看了你的代码和问题描述,发现了两个核心问题,直接导致numberOfItemsInSection和cellForItemAt完全没被触发,咱们一步步来修复:
1. 弹窗的parentVC变量根本没正确赋值
看你写的showPopup静态方法里,有一行完全错误的赋值:
parentVC = parentVC as? ViewController
这行代码没有给弹窗实例的parentVC属性赋值,反而把方法的参数变量给覆盖了!正确的写法应该是把传入的父控制器赋值给popupViewController的实例变量:
popupViewController.parentVC = parentVC as? ViewController
如果确定调用这个方法的都是ViewController类型,甚至可以直接强制转换(避免后续可选链的麻烦):
popupViewController.parentVC = parentVC as! ViewController
这一步不修复的话,就算后面数据源方法触发了,也会因为parentVC为nil直接崩溃。
2. UICollectionView的代理和数据源没绑定
你的PopUpController虽然实现了UICollectionViewDelegate和UICollectionViewDataSource协议,但有两种可能导致协议方法完全不执行:
- Storyboard未关联:如果你的collectionView是从Storyboard拖到控制器的,需要在Storyboard里右键点击collectionView,把
delegate和dataSource这两个选项拖到黄色的控制器图标上,完成关联。 - 代码手动绑定:如果不想依赖Storyboard的关联,可以在
viewDidLoad里手动加上这两行:
override func viewDidLoad() { super.viewDidLoad() // 新增这两行绑定代理和数据源 collectionView.delegate = self collectionView.dataSource = self print("parent has ", parentVC?.rightDevices.count, " items") collectionView.reloadData() }
额外的安全优化建议
为了避免后续出现崩溃,建议你把代码里的强制解包(比如left!、parentVC!)改成可选绑定,更安全:
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { print("number of items in section called") guard let isLeft = left, let parent = parentVC else { return 0 } return isLeft ? parent.leftDevices.count : parent.rightDevices.count }
另外还要确认CollectionCell在Storyboard里的复用标识符和你代码里的reuseIdentifier(也就是"cell")完全一致,不然单元格会无法加载。
验证步骤
- 先修复
showPopup里的parentVC赋值问题 - 完成collectionView的代理和数据源绑定(二选一即可)
- 重新运行项目,查看控制台是否打印出
number of items in section called和cell for item called,如果打印了,说明数据源方法正常触发,单元格应该就能显示了!
内容的提问来源于stack exchange,提问作者saladwithgrass
相关产品推荐
相关产品推荐

