更改选定的单元格图像uitableview

时间:2019-05-13 09:55:38

标签: swift xcode uitableview cell-formatting

我想在播放音乐时更改单元格图像,当我选择行更改图像时,我正在使用didselectrow为此,当我滚动时,我看到许多其他单元格图像也发生了更改,我不为什么请指导我 这是我的代码

 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
          let cell = tableView.cellForRow(at: indexPath) as? NaatListTableViewCell
            cell?.btnPlayPause.setImage(UIImage(named: "pause"), for: .normal)

    }

3 个答案:

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

上述方法处理tableViewsingle-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)