Swift4下用ExpandableCell库时,UITableViewCell无法加载UICollectionView求助
老哥,我一眼就瞅出你这问题大概率是代码注册Cell和Storyboard创建Cell冲突导致的!听我给你一步步拆解解决:
1. 先删掉代码里的Cell注册语句
你在viewDidLoad里写的register(ServicesCell.self, forCellReuseIdentifier: "servicesCell")是罪魁祸首!因为你已经在Storyboard里拖好了带UICollectionView的Cell,并且设置了复用标识和自定义类,再用代码注册会直接覆盖Storyboard的配置——此时系统会创建一个纯代码初始化的Cell实例,完全不会加载你在Storyboard里布局的UICollectionView和其他控件。
把这两行注册代码直接删掉就行!
2. 确认Storyboard里的Cell配置没毛病
打开你的Storyboard,选中那个带UICollectionView的展开Cell,逐一检查:
- Identity Inspector:把Class设置为你的
ServicesCell(或ConciergeCell),Module选当前项目(别留空)。 - Attributes Inspector:把Reuse Identifier设为
servicesCell(和你dequeue时用的标识完全一致)。 - 关联IBOutlet:在你的
ServicesCell类里必须有@IBOutlet weak var collectionView: UICollectionView!,然后在Storyboard里把CollectionView拖到Cell类里建立关联(确保连线没断)。
3. 完善Cell类的初始化代码
在你的自定义Cell类里,要在awakeFromNib()里做CollectionView的基础配置,别忘调用super:
class ServicesCell: ExpandableCell { @IBOutlet weak var collectionView: UICollectionView! override func awakeFromNib() { super.awakeFromNib() // 配置CollectionView的代理、数据源,注册CollectionCell collectionView.delegate = self collectionView.dataSource = self collectionView.register(YourCollectionCell.self, forCellWithReuseIdentifier: "yourCollectionCell") // 如果是Storyboard里的CollectionCell,这里就不用注册,直接在Storyboard里配置就行 } }
4. 正确使用dequeue方法
在tableView(_:cellForRowAt:)里,必须用带indexPath的dequeue方法,确保系统从Storyboard正确复用Cell:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "servicesCell", for: indexPath) as! ServicesCell // 这里配置Cell的展开状态、数据等 return cell }
5. 额外检查ExpandableCell库的集成
确保你的自定义Cell是继承自ExpandableCell(不是普通的UITableViewCell),并且按照库的文档配置好TableView的代理/数据源(比如有些库需要ViewController实现特定的协议来处理展开逻辑)。
按上面的步骤调整完,你的UICollectionView应该就能正常加载了!
内容的提问来源于stack exchange,提问作者user7189581

