Swift TableView单元格播放按钮单击和其他单元格按钮需要重置

时间:2018-11-12 19:21:10

标签: ios swift tableview

我正在尝试使用自定义audioTableView个文件列出到cell中。此处,每个单元具有单个button(用于play/pause音频)。我的问题是,如果我单击第一个单元格中的播放按钮,或者其他单元格选定的按钮需要reset(我的意思是第一个单元格单击playpause其他或先前选择的{{1 }}需要休息一下才能恢复正常)。

我的当前输出屏幕

playlist

在我正在使用的代码下方,提供一些想法

cell

2 个答案:

答案 0 :(得分:0)

在我的View Controller中的某个地方,我想有很多项目。该项目应具有一些属性,该属性表示项目是否为正在播放。例如

var isPlaying: Bool = // true if playing, false if not

如果只有字符串数组,则必须创建自定义类/结构

struct Audio {
    var title: String = ""
    var isPlaying: Bool = false
}

现在

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell: InviteCell = inviteTableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CustomOneCell

    let item = yourItemArray[indexPath.row]
    let image = item.isPlaying ? UIImage(named:"pause.png") : UIImage(named:"play.png")
    cell.playButton.setImage(image, for: UIControlState.normal)
    cell.btnCheck.tag = indexPath.row
    cell.btnCheck.addTarget(self, action: #selector(self.btnCheck(_:)), for: .touchUpInside)

    return cell
}

在操作按钮时,只需更改与索引相同的项目的值即可

@objc func btnCheck(_ sender: UIButton) {
    for item in yourItemArray {
        item.isPlaying = false
    }
    yourItemArray[sender.tag].isPlaying = !yourItemArray[sender.tag].isPlaying
    self.tableView.reloadData()
}

答案 1 :(得分:-1)

将此添加到您的CustomOneCell

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    playButton.setImage(UIImage(named: selected ? "pause.png" : "play.png"), for:.normal)
}

然后只需在btnCheck(_ sender: UIButton)

中选择您的单元格
func btnCheck(_ sender: UIButton) {
    let indexPath = IndexPath(row: sender.tag, section: 0)
    let cell = tableView.cellForRow(at: indexPath)

    guard !cell.isSelected else { return } // return if cell is already selected

    tableView.beginUpdates()
    tableView.selectRow(at: [indexPath], animated: true, scrollPosition: .none)
    tableView(tableView, didSelectRowAt: indexPath)
    tableView.endUpdates()
}