gpt4 book ai didi

ios - 如何访问自定义 CollectionView 单元格的初始值设定项?

转载 作者:搜寻专家 更新时间:2023-11-01 07:01:40 25 4
gpt4 key购买 nike

我有一个包含多个单元格的 collectionView。每个单元格都属于此类:

class OuterCollectionViewCell: UICollectionViewCell {

@IBOutlet weak var stackView: UIStackView!

override init(frame: CGRect) {
super.init(frame: frame)
print("initting")
for i in 1...30 {
let view = UIView()
view.backgroundColor = UIColor.red
view.tag = i

self.stackView.addSubview(view)
}
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}

}

我正在创建我希望像这样调用其初始化程序的每个单元格:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "outerCell", for: indexPath) as! OuterCollectionViewCell
cell.backgroundColor = UIColor.gray
return cell
}

我的目的是向这个水平 stackView 添加 30 个 subview ,以便显示 30 个条纹。我想在 init 中以编程方式添加这些 subview ,以避免必须在 Storyboard 中手动执行。但是现在没有调用 init 并且没有添加 View 。知道为什么会这样以及如何做到这一点吗?

最佳答案

which I would hope calls its initializer like so

您可以希望如此,但是,正如您正确地发现的那样,您注定要失望。通过调用 dequeue 生成的单元格永远不会调用其 init(frame:)

一个明显的解决方案是在 cellForItemAt 中添加 30 个 subview 。如果这样做,您还需要包括一个测试以确保您不会在下次重复使用该单元格时再次添加它们。换句话说,只有在它们不存在时才添加它们。

更简单:既然您已经实现了 init(coder:),为什么不将您的 30 个 subview 代码移到其中呢?这是一个初始化器,在通过出队创建单元格时调用,而当单元格仅被重用时,它不会(显然)被调用。

但是请注意,您的操作还有其他问题。正如您的代码所代表的那样,您的 View 没有大小,而且堆栈 View 将如何处理还远不清楚。此外,仅仅说 addSubview 不会导致堆栈 View 对您的 View 任何事情。所以基本上即使您的代码运行了,我也希望您实际上看不到任何东西。但是,让我们一次过一座桥。

关于ios - 如何访问自定义 CollectionView 单元格的初始值设定项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50867605/

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