自定义UITableViewCell button.backgroundColor自动更改

时间:2018-12-13 08:35:45

标签: ios swift uitableview

我有一个链接到TableViewCell的自定义tablevVewCell.swift单元格具有一个按钮,当touchedUpInside时该按钮将按钮颜色更改为绿色,但是当创建新单元格(可重复使用的出队属性)时,新单元格按钮也具有更改的(绿色)我也尝试使用if-else来处理这个问题,但是没有帮助。感谢所有帮助(我也在这里处理了多个部分)。基本上我的问题是如何知道在TableViewCell类中的按钮被点击并在MainVC中分配一个值?

MainVC:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell
    cell.layer.cornerRadius = 20
    cell.isUserInteractionEnabled = true

    if objArray.count > 0 {
        cell.courseCode.text = objArray[indexPath.section].code
        cell.courseName.text = objArray[indexPath.section].name
        cell.slot.text = objArray[indexPath.section].slot
        cell.year.text = objArray[indexPath.section].year
        cell.button.tag = indexPath.section
    }

    return cell
}

TableViewCell:

class TableViewCell: UITableViewCell {

    @IBOutlet weak var courseName: UILabel!
    @IBOutlet weak var courseCode: UILabel!
    @IBOutlet weak var slot: UILabel!
    @IBOutlet weak var year: UILabel!
    @IBOutlet weak var downloadButton: UIButton!
    @IBOutlet weak var button: UIButton!

    var buttonIsSelected:Bool = false

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
        // Configure the view for the selected state
    }

    @IBAction func button(_ sender: Any) {
        print(button.tag)
        buttonIsSelected = true
        button.backgroundColor = .green
    }

}

4 个答案:

答案 0 :(得分:0)

您来自objArray的对象应该具有一些属性

var isSelected: Bool

然后,当用户按下按钮时,应更改按钮的此属性(例如,使用委托模式)。

最后要做的就是根据项目的cellForRowAt属性在数据源方法isSelected中设置按钮的背景颜色

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    ...
    let item = objArray[indexPath.row]
    cell.button.backgroundColor = item.isSelected ? .green : .white //default
    ...
}

注意:代替使用indexPath.section,请使用indexPath.row


或者,如果您不需要在自定义模型中拥有此isSelected属性,则可以将objArray设为字典。

答案 1 :(得分:0)

将单元出队时,基本上是在使用已创建但尚未使用的旧单元。

因此,如果通过单击按钮将单元格的backgroundColor设置为绿色,则将其出队时,颜色将保持绿色。

这里需要两件事。

  1. 向模型对象添加颜色字段。.指示单元格的哪个背景已将颜色更改为绿色。

然后在cellForRow方法中

您将拥有这样的东西

cell.button.backgroundColor = objc[indexPath.section].hasChangedToGreen ? .green : nil
  1. 在TableViewCell类内部实现

    覆盖函数func prepareForReuse(){ super.prepareForResult() button.backgroundColor =无 }

答案 2 :(得分:0)

您需要跟踪为所有单元格选择的按钮,而不是为所有单元格选择的按钮

  1. 创建一个数组var buttonState = [Bool]()
  2. 此数组应等于您的objArray的长度
  3. 最初它将具有所有假值
  4. 请勿将indexPath.section用作单元格的标记,而应使用indexPath.row

现在,您在viewController用户中查看以下代码

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell
    cell.layer.cornerRadius = 20
    cell.isUserInteractionEnabled = true
    cell.button.addTarget(self, action: #selector(didTapButton(sender:)), for: .touchUpInside)
        if objArray.count>0{
            cell.courseCode.text = objArray[indexPath.section].code
            cell.courseName.text = objArray[indexPath.section].name
            cell.slot.text = objArray[indexPath.section].slot
            cell.year.text = objArray[indexPath.section].year
            cell.button.tag = indexPath.row
        }
    if buttonState[indexpath.row] {
    cell.button.backgroundColor = .green
   }
    else{
      cell.button.backgroundColor = defaultColor `//color of you choice`
    }
        return cell
    }

     @objc func didTapButton(sender:UIButton){
    print(button.tag)
    let state = buttonState[button.tag]
    if !state{
        button.backgroundColor = .green
        buttonState[sender.tag] = true
       }
    }

并将您的自定义单元格类更改为此

 class TableViewCell: UITableViewCell {
    @IBOutlet weak var courseName: UILabel!
    @IBOutlet weak var courseCode: UILabel!
    @IBOutlet weak var slot: UILabel!
    @IBOutlet weak var year: UILabel!
    @IBOutlet weak var downloadButton: UIButton!
    @IBOutlet weak var button: UIButton!

    override func awakeFromNib() {
        super.awakeFromNib()
    }


    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

    }

答案 3 :(得分:0)

请输入按钮操作方法:

 @IBAction func button (_ sender: Any) {
     let btn = sender as! UIButton
     btn.isSelected = !btn.isSelected
}

然后在CellForRowAtIndexPath方法中检查此条件:

    if cell.button.isSelected {
       //Your colour
    } else {
       //Your colour
    }

它可能会帮助您。谢谢