Доступ к вложенному collectionView в viewController, который не имеет ссылки на него

Мне нужно получить ссылку на collectionView, который вложен в другой collectionView, чтобы я мог выполнять обновления пользовательского интерфейса.

В моем классе ViewController у меня есть выход для "внешнего" collectionView:

@IBOutlet var outerCollectionView: UICollectionView!

Я устанавливаю DataSource и Delegate для "внутреннего" collectionView в willDisplayCell:

func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
    guard let outerViewCell = cell as? OuterCollectionCell else { return }
    outerViewCell.setCollectionViewDataSourceDelegate(dataSourceDelegate: self, forItem: indexPath.item)
              outerViewCell.innerCollectionView.reloadData()
              outerViewCell.innerCollectionView.layoutIfNeeded()
}

Затем я могу заполнить ячейки для обоих коллекций в cellForItemAt:

 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    if collectionView == self.outerCollectionView {
        let outerCell: OuterCollectionCell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifierOuter, for: indexPath) as! OuterCollectionCell

        outerCell.labelCell.text = self.packArray[indexPath.item].title

        // other stuff....

        return outerCell

    } else {// innerCollectionView
        let innerCell: InnerCollectionCell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifierInner, for: indexPath) as! InnerCollectionCell

        innerCell.imageCell.file = self.multiPartArray[collectionView.tag][indexPath.item].image

        // other stuff....

        return innerCell
    }
 }

Это дает следующий результат:

введите описание изображения здесь

Где collectionView.tag - это экземпляр "внутреннего" collectionView (0 - синий эффект).

Теперь я хочу выполнить обновления пользовательского интерфейса в ячейках и по разным причинам не могу использовать cellForItemAt. Итак, что я сделал ранее, это что-то вроде:

if let editCell = collectionView.cellForItem(at: indexPath) as? InnerCollectionCell {
    editCell.imageCell.image = UIImage(named: "test")
}

Однако, чтобы сделать это, мне нужна ссылка на "внутренний" collectionView, которого у меня нет, потому что он мог быть повторно использован ко времени выполнения этих обновлений пользовательского интерфейса. Однако у меня есть collectionView.tag, который является просто ссылкой Int и indexPath ячейки, для которой я хочу выполнить обновление.

Могу ли я UI указанной ячейки внутри collectionView, к которой у меня нет прямой ссылки, или это просто желаемое за действительное?

Я должен с какой-то делегатской функцией, я просто не могу думать как. Также для справки ниже мой класс OuterCollection, где я определяю "внутренний" collectionView и устанавливаю источник данных и делегат.

class OuterCollectionCell: UICollectionViewCell {

@IBOutlet var labelCell: UILabel!
// define the smaller collection view that is in the cell
@IBOutlet var innerCollectionView: UICollectionView!

// set delegate and datasource for new collectionView
// this is download collection manager
func setCollectionViewDataSourceDelegate
    <D: UICollectionViewDataSource & UICollectionViewDelegate>
    (dataSourceDelegate: D, forItem item: Int) {

    innerCollectionView.delegate = dataSourceDelegate
    innerCollectionView.dataSource = dataSourceDelegate
    innerCollectionView.tag = item
    innerCollectionView.reloadData()
    innerCollectionView.layoutIfNeeded()

}
}

1 ответ

У вас могут быть методы делегата и источника данных innercollectionview, определенные в классе OuterCollectionCell. Попробуй это:-

        // Set the delegate and datasource in your custom cell class as below:-
       class OuterCollectionCell: UITableViewCell {
        // set the delegate & datasource of innercollectionView in the init or  
        // awakefromnib or storyboard. 
        // I have set it in storyboard and it works for me. 
        // Implement the datasource and delegate methods of innercollectionView in this class.
       }

Таким образом, делегат и источник данных innerCollectionView будут отделены от externalcollectionview, и вы сможете обрабатывать всю логику innecrCollectionView в классе ячеек OuterCollection.

Другие вопросы по тегам