【问题标题】:How can i stop my tableView cell from reusing the button inside it?如何阻止我的 tableView 单元格重复使用其中的按钮?
【发布时间】:2017-09-03 18:22:35
【问题描述】:

我在协议中有一个函数,它以 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 并实现委托及其功能,即在点击时更改按钮的图像。 “goingSelected”是绿色图像,“goingDeselected”是红色图像。

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

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

【问题讨论】:

标签: ios swift uitableview tableview swift-protocols


【解决方案1】:

有可能

直接替换

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 输入真或假

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

【讨论】:

  • 您不想这样做。不要避免重复使用单元格。
  • @rmaddy 我已经提供了更好的答案,那就是改变逻辑
【解决方案2】:

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

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

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
}

【讨论】:

    猜你喜欢
    • 2020-12-10
    • 1970-01-01
    • 2023-03-13
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 2013-05-13
    相关资源
    最近更新 更多