如何阻止我的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 }