我有一个链接到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
}
}
答案 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设置为绿色,则将其出队时,颜色将保持绿色。
这里需要两件事。
然后在cellForRow方法中
您将拥有这样的东西
cell.button.backgroundColor = objc[indexPath.section].hasChangedToGreen ? .green : nil
在TableViewCell类内部实现
覆盖函数func prepareForReuse(){ super.prepareForResult() button.backgroundColor =无 }
答案 2 :(得分:0)
您需要跟踪为所有单元格选择的按钮,而不是为所有单元格选择的按钮
var buttonState = [Bool]()
objArray
的长度现在,您在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
}
它可能会帮助您。谢谢