UICollectionViewCell代理为nil问题:代理创建类异常排查
解决UICollectionViewCell代理为nil的问题
你这明显是踩了UICollectionView复用机制的常见坑,咱们一步步把问题捋清楚:
问题根源
你手动创建的CampaignCollectionViewCell()实例,和campaignCollectionView实际显示、复用的cell完全是两个独立对象!给这个手动创建的cell赋值delegate,对列表里真正在使用的cell没有任何作用。
正确解决方案
你需要在UICollectionViewDataSource的cellForItemAt方法里,给复用出来的目标cell设置delegate:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { // 注意替换成你自己的cell复用标识符 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CampaignCellID", for: indexPath) as! CampaignCollectionViewCell // 关键步骤:在这里给当前要显示的cell赋值delegate cell.delegate = self // 别忘了给cell设置indexPath(你的按钮点击逻辑里用到了这个属性) cell.indexPath = indexPath // 其他cell的配置逻辑... return cell }
额外注意事项
- 确保你在Storyboard/XIB里给cell设置的复用标识符,和
dequeueReusableCell里的字符串完全一致,不然会找不到cell。 - 你的主类必须遵守
CampaignCollectionViewCellDelegate协议,并且实现协议方法:
extension 你的主类名称: CampaignCollectionViewCellDelegate { func campaignCollectionViewCell(_ Cell: CampaignCollectionViewCell, didContributePressed: UIButton, at indexPath: IndexPath) { // 在这里实现按钮点击后的业务逻辑 } }
- 检查
CampaignCollectionViewCell里的indexPath属性是否正确定义,建议用var indexPath: IndexPath!或者可选类型,避免空值引发崩溃。
之前直接创建cell实例的做法完全无效,因为UICollectionView会自行管理cell的创建与复用,只有在cellForItemAt里拿到的才是当前要显示的那个cell对象。
内容的提问来源于stack exchange,提问作者Ahsan
相关产品推荐
相关产品推荐

