gpt4 book ai didi

ios - 在没有引用它的 viewController 中访问嵌套的 collectionView

转载 作者:行者123 更新时间:2023-11-28 15:52:02 25 4
gpt4 key购买 nike

我需要获取嵌套在另一个 collectionView 中的 collectionView 的引用,以便我可以执行 UI 更新。

在我的 ViewController 类中,我有一个“外部”collectionView 的导出:

@IBOutlet var outerCollectionView: UICollectionView!

我在 willDisplayCell 中为“内部”collectionView 设置了 DataSource 和 Delegate:

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 中填充两个 collectionView 的单元格:

 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
}
}

这会产生以下结果:

enter image description here

其中 collectionView.tag 是“内部”collectionView 的实例(0 是蓝色等)。

现在我想在单元格上执行 UI 更新,但由于各种原因不能使用 cellForItemAt。所以我之前所做的是这样的:

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

然而,要做到这一点,我需要引用我没有的“内部”collectionView,因为在执行这些 UI 更新时它可能已被重用。然而,我所拥有的是 collectionView.tag,它只是一个 Int 引用和我要对其执行更新的单元格的 indexPath。

我可以在没有直接引用的 collectionView 中使用指定单元格的 UI,还是这只是一厢情愿?

我应该使用某种委托(delegate)函数,我只是想不出如何。下面还有我的 OuterCollection 类供引用,我在其中定义了“内部”collectionView 并设置了数据源和委托(delegate)。

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()

}
}

最佳答案

您可以在 OuterCollectionCell 类中定义 innercollectionview 的委托(delegate)和数据源方法。试试这个:-

        // 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 的委托(delegate)和数据源将与 outerCollectionView 分开,您可以在 OuterCollection 单元类中处理 innecrCollectionView 的所有逻辑。

关于ios - 在没有引用它的 viewController 中访问嵌套的 collectionView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42183290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com