微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当我在 iOS 14 上的 UITableView 单元格中使用 UICollectionView 时,不会调用 UICollectionView cellForItemAt

如何解决当我在 iOS 14 上的 UITableView 单元格中使用 UICollectionView 时,不会调用 UICollectionView cellForItemAt

我知道这听起来很重复,并且有数以百万计的问题是这样问的,但是当我在 iOS 14 上的 tableView 单元格中使用 collectionView 时,不会调用 collectionView cellForItemAt 函数,它适用于 iOS 12。

I attached a demo project for it.

这是我的 tableView 单元格,里面有一个 collectionView:

 class ServicesTableViewCell: UITableViewCell {
    
    @IBOutlet weak var parentView: UIView!
    @IBOutlet weak var collectionView: UICollectionView!
    
    var items = [String]()
    var data: ServiceRow?
    
    override func awakeFromNib() {
        super.awakeFromNib()
        
        collectionView.frame.size = CGSize(width: screenWidth,height: 50)
        collectionView.register(UINib(nibName: "ServiceFilterCell",bundle: Bundle.main),forCellWithReuseIdentifier: "ServiceFilterCell")
        collectionView.delegate = self
        collectionView.dataSource = self
        collectionView.reloadData()
    }
    
    func fill(with data:ServiceRow) {
        items = data.items?.compactMap({$0.name}) ?? []
        parentView.backgroundColor = .clear
        collectionView.reloadData()
    }
}

extension ServicesTableViewCell: UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout {

    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }
    
    func collectionView(_ collectionView: UICollectionView,numberOfItemsInSection section: Int) -> Int {
        return items.count
    }
    
    func collectionView(_ collectionView: UICollectionView,cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { // <= This guy is not called
        let data = items[collectionView.tag]
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ServiceFilterCell",for: indexPath) as! ServiceFilterCell
        cell.fill(title: data,isSelected: false)
        return cell
    }
    
    func collectionView(_ collectionView: UICollectionView,layout collectionViewLayout: UICollectionViewLayout,sizeforItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: 80,height: 40)
    }
}

这是我的父类 tableView cellForRowAt:

 func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "ServicesTableViewCell",for: indexPath) as! ServicesTableViewCell
        cell.collectionView.tag = indexPath.section
        cell.fill(with: services[indexPath.section])
        cell.frame.size = CGSize(width: cell.frame.width,height: 50)
        cell.collectionView.reloadData()
        cell.layoutIfNeeded()
        return cell
    }

这是 Tarun Tyagi 回答的屏幕截图:

enter image description here

最后,问题是tableViewCell的xib文件在我创建时符合collectionViewCell,所以我创建了一个tableViewCell,现在一切正常!

解决方法

检查您的布局代码并确保在运行时 UICollectionView 具有非零大小(宽度和高度都必须 > 0)。

如果 width/height 中的任何一个为零,它不需要显示任何内容,因此它不会调用 cellForItemAt: 的 dataSource 实现。

您可以使用 View Hierarchy Debugger 在运行时检查 UICollectionViewwidth/height 值。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。