我怎样才能阻止我的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)
}
}
}
有可能
只是更换
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
...
}
你不想这样做。不要避免重复使用单元格。 – rmaddy
@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
}
的可能的复制[如何防止从的UITableView重用定制单元斯威夫特(https://stackoverflow.com/问题/ 37938809/how-to-prevent-uitableview-from-reuse-custom-cells-swift) – 2017-09-03 18:32:14
您不想避免重复使用单元格。这不是合适的解决方案。 – rmaddy