如何阻止我的tableView单元重用其中的按钮?

我在协议中有一个函数,它将TableViewcell作为参数。

protocol GoingButtonDelegate { func goingButtonPressed(cell: TableViewCell) } class TableViewCell: UITableViewCell { // Outlets @IBOutlet weak var goingButton: UIButton! var delegate: GoingButtonDelegate? @IBAction func goingButtonTapped(_ sender: Any) { delegate?.goingButtonPressed(cell: self) } 

然后我转到我的ViewController并实现委托及其function,即在点击时更改按钮的图像。 “goSelected”是绿色图像,“goingDelected”是红色图像。

这一切都很好,当点击一个单元格的按钮从红色变为绿色,反之亦然。 但是,当单元格被重用时,单元格的按钮状态会持续存在并重新用于进入视图的新行。 有没有办法阻止这种情况发生?

  extension ViewController: GoingButtonDelegate { func goingButtonPressed(cell: TableViewCell) { cell.goingButton.isSelected = !cell.goingButton.isSelected if cell.goingButton.isSelected == true { cell.goingButton.setImage(UIImage(named: "goingSelected"), for: UIControlState.selected) } else if cell.goingButton.isSelected == false { cell.goingButton.setImage(UIImage(named: "goingDeselected"), for: UIControlState.normal) } } } 

这是可能的

只是替换

 let cell = tableView.dequeueReusableCell(withIdentifier: identifier, for: indexPath) 

有:

 let cell= Bundle.main.loadNibNamed(identifier, owner: self, options: nil)?[0] 

但我认为你需要改变你的app逻辑。

在您的单元格类中设置Images

 class TableViewCell: UITableViewCell { override func awakeFromNib() { super.awakeFromNib() self.goingButton.setImage(UIImage(named: "goingDeselected"), for:.normal) self.goingButton.setImage(UIImage(named: "goingSelected"), for:.selected) } } 

并在方法goingButtonPressed(cell: TableViewCell)更改为您的对象并只设置Bool类型为true或false

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { ... cell.goingButton.isSelected = object.isSelected ... } 

您需要将所选行存储在索引路径数组中,在此之前我认为您应该进行一些增强…或者很多!!

单元格本身应该处理它的按钮,控制器应该只跟踪所有单元格状态。 将这两个属性添加到您的单元格

 class TableViewCell: UITableViewCell { var indexPath:IndexPath? var isSelected : Bool = false { didSet{ if isSelected { cell.goingButton.setImage(UIImage(named: "goingSelected"), for: UIControlState.normal) } else { cell.goingButton.setImage(UIImage(named: "goingDeselected"), for: UIControlState.normal) } } } // Outlets @IBOutlet weak var goingButton: UIButton! var delegate: GoingButtonDelegate? @IBAction func goingButtonTapped(_ sender: Any) { self.isSelected = !self.isSelected delegate?.goingButtonPressed(cell: self) } .. ... } 

并将所选单元格存储在视图控制器中,以跟踪每个单元格状态。

 extension ViewController: GoingButtonDelegate { var selectedCells = NSMutableArray() func goingButtonPressed(cell: TableViewCell) { if cell.isSelected { selectedCells.add(cell.indexPath) } else { selectedCells.remove(cell.indexPath) } } } 

并在您的“行中的单元格”方法中添加一个小的更改

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "yourCellIdentifier") as! TableViewCell cell.indexPath = indexPath cell.isSelected = selectedCells.contains(indexPath) .. ... return cell }