因此,基本上我的问题是,当我单击集合视图单元格中出现的button
时,它应该更改按钮背景色的颜色。但问题在于它正在更改另一个按钮的颜色。例如,如果我单击按钮1,它将自动更改按钮6的颜色。
class hello: UICollectionViewCell {
@IBOutlet weak var btn: UIButton!
@IBAction func click(_ sender: Any) {
if btn.isSelected == true
{
btn.backgroundColor = UIColor.red
btn.isSelected = false
}
else{ btn.backgroundColor = UIColor.purple
btn.isSelected = true
}
}
override func prepareForReuse() {
super.prepareForReuse()
}
}
view controller file
func collectionView(_ collectionView:UICollectionView,cellForItemAt indexPath:IndexPath)-> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "happy", for: indexPath) as! hello
if cell.btn.isSelected
{
cell.btn.backgroundColor = UIColor.red
}
else{ cell.btn.backgroundColor = UIColor.purple
}
cell.btn.tag = indexPath.item
print(cell.btn.isSelected ,indexPath.row)
return cell
}
答案 0 :(得分:1)
问题在于UICollectionView重用单元以优化滚动性能。因此,当例如在索引6处显示单元格时,它会重新使用索引1处的单元格。因此,无论何时更新/重用单元格,都需要设置其状态。
每次都会调用以下函数。因此,您需要设置cell.btn。这是backgroundColor。
func collectionView(_ collectionView: UICollectionView, cellForItemAt
indexPath: IndexPath) -> UICollectionViewCell {
...
...
if dataSource[indexPath.row].selected {
btn.backgroundColor = UIColor.red
}else {
btn.backgroundColor = UIColor.purple
}
...
return cell
}
现在,取决于您的个人实现,更改选择时如何更新模型。一种选择是,您可以定义协议并在ViewController中实现该协议以更新值。