我怎样才能阻止我的tableview单元格重新使用它里面的按钮?

问题描述:

我有一个协议内的函数,它将TableViewcell作为参数。我怎样才能阻止我的tableview单元格重新使用它里面的按钮?

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和实现委托和它的功能,这是挖掘何时改变按钮的图像。 “正在选择”是绿色图像,“正在选择”是红色图像。

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

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

的可能的复制[如何防止从的UITableView重用定制单元斯威夫特(https://stackoverflow.com/问题/ 37938809/how-to-prevent-uitableview-from-reuse-custom-cells-swift) – 2017-09-03 18:32:14

+0

您不想避免重复使用单元格。这不是合适的解决方案。 – rmaddy

有可能

只是更换

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

你不想这样做。不要避免重复使用单元格。 – rmaddy

+0

@rmaddy我已经提供了答案,更好的将是改变逻辑 –

您需要存储选定行内在一系列索引路径中,在这之前我认为你应该做一些增强......或者很多!

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

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 
}