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

时间:2017-09-03 18:22:36

标签: ios swift uitableview tableview swift-protocols

我在协议中有一个函数,它将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并实现委托及其功能,即在点击时更改按钮的图像。 " goSelected"是一个绿色的图像和"去取消选择"是一个红色的图像。

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

 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)
        }
    }
}

2 个答案:

答案 0 :(得分:0)

可能

只需替换

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

使用:

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

但我认为您需要更改自己的应用逻辑。

在您的单元格类中设置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)中将cell更改为您的对象 并设置Bool类型为true或false

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

答案 1 :(得分:0)

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

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

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)
        }
    }
}

并在你的"行中的#34;方法只需添加一个小改动

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
}