我在协议中有一个函数,它将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)
}
}
}
答案 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
}