在我的项目中,我有一个UICollectionView。在UICollectionView中,我有一个自定义单元格。
在“ didSelectItemAt”中选择单元格值时,我可以打印该单元格值,但是,如果我尝试在此方法中以任何方式编辑单元格,则该值不会更改。
我确定我缺少什么,任何帮助将不胜感激!
@IBOutlet weak var collectionView: UICollectionView!
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return statValues.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "customCollectionViewCell", for: indexPath) as! customCollectionViewCell
cell.statLabel.text = statHeaders[indexPath.row]
cell.statLabel.textColor = UIColor(red:0.31, green:0.31, blue:0.31, alpha:1.0)
return cell
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "customCollectionViewCell", for: indexPath) as! customCollectionViewCell
print(cell.statLabel.text)
cell.backgroundColor = UIColor.yellow
collectionView.reloadData()
}
当用户选择一个单元格时,代码可以正确打印indexPath的值,但是backgroundColor不会更改。
答案 0 :(得分:3)
我的猜测是您正在创建一个新的cell实例,而不是使用collectionView中的那个实例
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
// Change this line
let cell = collectionView.cellForItemAtIndexPath(indexPath: indexPath)
print(cell.statLabel.text)
cell.backgroundColor = UIColor.yellow
collectionView.reloadData()
}
此外,您可能应该为真相来源保留一个外部数据模型。如果您有足够的collectionViews需要滚动,则在屏幕外滚动时,您的单元格将以随机顺序重用,从而导致您未单击的单元格变为黄色。
创建一个单独的数组,例如
var selectedStatHeaders: Set<Int>()
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "customCollectionViewCell", for: indexPath) as! customCollectionViewCell
cell.statLabel.text = statHeaders[indexPath.row]
cell.statLabel.textColor = UIColor(red:0.31, green:0.31, blue:0.31, alpha:1.0)
// Reset/configure cell each reload
if selectedStatHeaders.contains(indexPath.row) { // Can also make this into a ternary
cell.backgroundColor = UIColor.yellow
} else {
cell.backgroundColor = UIColor.whit
}
return cell
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
selectedStatHeaders.insert(indexPath.row)
collectionView.reloadItemsAtIndexPath(indexPath: indexpath)
}
答案 1 :(得分:0)
嗯...如果代码可以打印,但背景没有改变颜色,则没有意义。您是说从黄色变回白色吗?无论如何,这只是一种预感,但我怀疑这是因为您在设置backgroundColor更改后正在调用collectionView.reloadData()
。
https://developer.apple.com/documentation/uikit/uicollectionview/1618078-reloaddata
这将导致集合视图放弃当前可见的所有内容 项目(包括占位符)并根据当前项目重新创建项目 数据源对象的状态。