代码之家  ›  专栏  ›  技术社区  ›  Nate

未调用CollectionView cellForitemat

  •  1
  • Nate  · 技术社区  · 6 年前

    我有一个 UITableView 其中每个原型单元都有一个 UICollectionView 在里面。这个集合视图应该是一个图像网格。我对斯威夫特很陌生,在谷歌上搜索了几个小时(读了很多StackOverflow的文章),似乎找不到这个问题的正确答案。

    为什么不调用CollectionView cellForitemat?

    我看到了我的收藏观 numberOfItemsInSection 方法和集合视图 sizeForItemAt 方法被调用。我一定要把我的 TableViewCell 作为CollectionView的委托和数据源。我在带有outlets的接口生成器中完成了这项工作,在我的自定义tableviewcell的 awakeFromNib 方法

    cardImagesCollection.delegate = self
    cardImagesCollection.dataSource = self
    

    不管我做什么,我似乎都不能让这叫做它。我确保设置了良好的约束,因为这会在TableViewCells上烧掉我一次。

    为了我的生命,我不能让它加载收藏视图。

    任何帮助都将不胜感激。

    具体来说,我使用的是xcode 9.4.1和swift 4.1。

    谢谢

    编辑-添加示例代码

    家庭视图控制器:uiviewcontroller

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "LatestCardCell", for: indexPath) as! LatestCardsTableViewCell
    
        cell.backgroundColor = UIColor.clear
        cell.card = cards[indexPath.row]
        return cell
    }
    

    LatestCardStableViewCell:uiTableViewCell

    @IBOutlet weak var cardImagesCollection: UICollectionView!
    
    var card: Card! {
        didSet {
            titleLabel.attributedText = FontUtil.attributedCardTitleText(string: card.title)
            descriptionLabel.attributedText = FontUtil.attributedCardDescriptionText(string: card.description)
        }
    }
    
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        print("count")
        return card.imageUrls.count
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        print("here")
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "LatestCardsImage", for: indexPath as IndexPath) as! LatestCardImageCell
    
        //let url = card.imageUrls[indexPath.row]
        //cell.imageView.image = UIImage(named: "test")
    
        cell.backgroundColor = UIColor.blue
        return cell
    }
    
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: 150, height: 150)
    }
    

    最新的CardImageCell:uiCollectionViewCell

    @IBOutlet weak var imageView: UIImageView!
    

    编辑2:我尝试过的建议摘要

    人们建议在 cellForRowAt 调用我构建集合视图的位置:

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "LatestCardCell", for: indexPath) as! LatestCardsTableViewCell
    
        cell.cardImagesCollection.delegate = cell
        cell.cardImagesCollection.dataSource = cell
        cell.backgroundColor = UIColor.clear
        cell.card = cards[indexPath.row]
        return cell
    }
    

    这并没有改变什么。他们还建议在设置cell.card之后立即在该cellForRowat调用中添加以下内容:

    cell.cardImagesCollection.reloadData()
    

    这也没有改变什么。

    我在TableViewCell的自定义类中设置了断点并进行了日志记录,我可以看到 项目编号部分 为每个TableViewCell获取一次调用,并返回正确的数字(此数字因TableViewCell而异)。我也明白了 SizeFaritemat公司 被打电话的确切次数 项目编号部分 返回。但是,我没有看到 cellForItemAt 方法被调用。

    下面是日志:

    numberOfItemsInSection: 6
    sizeForItemAt: Section 0 Row 0
    sizeForItemAt: Section 0 Row 1
    sizeForItemAt: Section 0 Row 2
    sizeForItemAt: Section 0 Row 3
    sizeForItemAt: Section 0 Row 4
    sizeForItemAt: Section 0 Row 5
    numberOfItemsInSection: 2
    sizeForItemAt: Section 0 Row 0
    sizeForItemAt: Section 0 Row 1
    numberOfItemsInSection: 4
    sizeForItemAt: Section 0 Row 0
    sizeForItemAt: Section 0 Row 1
    sizeForItemAt: Section 0 Row 2
    sizeForItemAt: Section 0 Row 3
    

    有人建议确定 CellForitemat酒店 使用autocomplete而不是复制和粘贴,这是我最初的做法。我还使用以下协议设置了自定义TableViewCell UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout 它并不抱怨 CellForitemat酒店 方法。我目前在interfacebuilder中设置了委托和数据源,这就是我看到的方法调用。

    我试过打电话 reloadData() 在多个地方的collectionview上(第二次设置 cell.card 在我的 牢房 ,在我的 didSet 打电话,甚至 从涅盘醒来 方法。什么都不管用。

    TableCell呈现的其他方面,但不是此图像集合。我已经在interfacebuilder中硬编码了collectionview单元格的大小,甚至重写了sizeforitemat以始终返回 CGSize(width: 150, height: 150) ,只是为了确保问题不是因为手机太小而看不见。TableView单元格设置为自动高度 latestCardsTableView.rowHeight = UITableViewAutomaticDimension ,我已将长文本添加到标签中,以确保它们的大小随文本自动增长。

    有人有其他想法吗?有什么东西我可以从interfacebuilder截图,或者一些我可以编写的快速代码来强制一些自动布局的东西吗?我什么都愿意。

    编辑三:一线希望

    我发现如果我给uitableviewcell一个显式的大高度,uicollectionview就会出现并调用 CellForitemat酒店 .那么,如何设置约束,以便uiCollectionView强制uiTableViewCell变大 rowHeight = UITableViewAutomaticDimension 放在我的桌面上?

    Collection View Constriants

    1 回复  |  直到 6 年前
        1
  •  1
  •   nikBhosale    6 年前

    也许你可以跟着做, 在最新的CardStableviewCell类中编写一个方法,

    func configureCell() {
          cardImagesCollection.reloadData()
    }
    

    然后调用这个方法,在HomeViewcontroller的cellForRowatindexpath中,如下所示,

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "LatestCardCell", for: indexPath) as! LatestCardsTableViewCell
    
    cell.backgroundColor = UIColor.clear
    cell.card = cards[indexPath.row]
    cell. configureCell()
    return cell
    

    }