You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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")完全一致,不然单元格会无法加载。

验证步骤

  1. 先修复showPopup里的parentVC赋值问题
  2. 完成collectionView的代理和数据源绑定(二选一即可)
  3. 重新运行项目,查看控制台是否打印出number of items in section called和cell for item called,如果打印了,说明数据源方法正常触发,单元格应该就能显示了!

内容的提问来源于stack exchange,提问作者saladwithgrass

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 06:56:23