集合视图单元格操作中的uibutton复制

时间:2018-07-24 07:30:18

标签: ios swift uicollectionview uibutton

因此,基本上我的问题是,当我单击集合视图单元格中出现的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
}

1 个答案:

答案 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中实现该协议以更新值。