我想在播放音乐时更改单元格图像,当我选择行更改图像时,我正在使用didselectrow为此,当我滚动时,我看到许多其他单元格图像也发生了更改,我不为什么请指导我 这是我的代码
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let cell = tableView.cellForRow(at: indexPath) as? NaatListTableViewCell
cell?.btnPlayPause.setImage(UIImage(named: "pause"), for: .normal)
}
答案 0 :(得分:0)
尝试:
var isPlayingIndex = -1
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
let cell = tableView.cellForRow(at: indexPath) as? NaatListTableViewCell
if indexPath.row == isPlayingIndex {
cell?.btnPlayPause.setImage(UIImage(named: "play"), for: .normal)
}else {
cell?.btnPlayPause.setImage(UIImage(named: "pause"), for: .normal)
}
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let cell = tableView.cellForRow(at: indexPath) as? NaatListTableViewCell
if indexPath.row == isPlayingIndex {
cell?.btnPlayPause.setImage(UIImage(named: "pause"), for: .normal)
isPlayingIndex = -1
} else {
// stop current player
//
isPlayingIndex = indexPath.row
cell?.btnPlayPause.setImage(UIImage(named: "play"), for: .normal)
}
}
答案 1 :(得分:0)
您可以通过在自定义didSelectRowAt
中实现 setSelected(_:animated:)
方法并处理图像状态来代替另一种方法,即通过UITableViewCell
方法更改图像在那里,即
override func setSelected(_ selected: Bool, animated: Bool) {
if selected {
btnPlayPause.setImage(UIImage(named: "pause"), for: .normal)
} else {
btnPlayPause.setImage(UIImage(named: "play"), for: .normal)
}
}
上述方法处理tableView
和single-selection
模式下multi-selection
中所有单元格的选择和取消选择。
此后,您无需使用tableView(_:didSelectRowAt:)
方法编写任何内容。
答案 2 :(得分:0)
您需要手动维护单元的状态。您可能还需要与单元关联的其他数据,从您要求的似乎是音乐文件列表的数据来看,您可以将每种音乐与模型中的唯一ID关联。现在创建一个类型为var isPlaying = [Int: Bool]()
的地图(假设您要使用整数ID)
然后在didSelectRowAt
中设置具有相应ID的值
self.isPlaying[YOUR_ID] = cell.isSelected
现在使用您的cellForRowAt
方法
var imageName = self.isPlaying[YOUR_ID] ? "play" : "pause"
cell?.btnPlayPause.setImage(UIImage(named: imageName), for: .normal)