UIButton 正在更改 collectionView 单元格中的其他 UIButton,我该如何防止这种情况发生?

UIButton is changing other UIButton's in collectionView cell, how do I prevent this?

我创建了一个包含 UIButton 的自定义 collectionView 单元格 class。所以每个单元格都包含用户可以按下的自己的按钮。但是,只要点击一个单元格按钮,就会导致其他单元格中按钮的背景颜色发生变化。我希望它只更改所选按钮的背景颜色,并防止更改其他按钮。下面是我的代码:

      override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellID", for: indexPath) as! SubjectsCell


    cell.subjectButton.setTitle(subjectNames[indexPath.row], for: .normal)
    cell.subjectButton.addTarget(self, action: #selector(updateBackgroundColor(_:)), for: .touchUpInside)

    if cell.subjectButton.isChosen == selectedState{
        cell.subjectButton.backgroundColor = .green        }

    else if cell.subjectButton.isChosen != selectedState {
        cell.subjectButton.backgroundColor = UIColor(red: 34.0/255.0, green: 210.0/255.0, blue: 255.0/255.0, alpha: 1)


    }

    return cell

我意识到 dequeueReusableCell 会导致某些单元格被重用,如果这是我的问题,我如何防止单元格更改发生在随机单元格上并且只影响点击按钮所在的单元格。

您说得对,dequeueReusableCell(withReuseIdentifier:for:) 是问题的根源!您只需要让您的单元格 class 覆盖 UICollectionReusableViewprepareForReuse() 方法并将背景重置为所需的背景。

您可能需要更改数据模型,以便记住哪些单元格按下了按钮,因为单元格无法保留该数据而不会导致问题。

另请注意,在 collectionView(_:cellForItemAt:) 中调用 addTarget 可能会导致以后出现问题,通常仅在最初设置对象时添加一次目标。为避免出现问题,您应该在笔尖/情节提要中将其设置为操作,或者如果您正在进行编程视图设置,则在设置视图对象时设置。

Here's Apple's documentation on prepareForReuse().

你可以这样做:

class SubjectsCell : UICollectionViewCell 
{
@IBAction func buttonAction(_ sender: UIButton) {
 updateBackgroundColor()
}
}

因此单元格视图背景更新应该出现在 SubjectsCell 中,因为它的视图更新不在 viewController 的作业中。