Доступ к вложенному 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.