如果在TableView didSelectRowAtIndexPath函数中选择了其他行,如何将图像更改为以前的状态?

时间:2016-07-15 07:28:05

标签: swift uitableview playback didselectrowatindexpath

所以我有动态tableview,每行都有播放图像。如果我选择行图像将更改为暂停图标。但是,如果我选择另一行,我需要先前选择的行上的图像再次显示播放图标。 如何处理这样的功能?

我只有:

     class ViewController: UIViewController {
        var stations = [
        (stationIcon: "rr_icon", stationName: "Radio1", urlString: "http://.._320", isPlaying: false),
        (stationIcon: "mm_icon", stationName: "Record2", urlString: "http://../_320", isPlaying: false),
........]

         func playSelectedStation(indexPath: NSIndexPath) {
        let url = NSURL(string: stations[indexPath.row].urlString)!
        stations[indexPath.row].isPlaying = true
        avPlayer = AVPlayer(URL: url)
        avPlayer.play()
    }


    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCellWithIdentifier("cell") as! RadioTableViewCell
            cell.playPause.image = stations[indexPath.row].isPlaying ? UIImage(named: "cellPause") : UIImage(named: "cellPlay")
            return cell
        }

        func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

            switch indexPath.row {
            playSelectedStation(indexPath)
        tableView.reloadData()

广播电台正在不断变化,只有播放/暂停图标状态才会出现问题

2 个答案:

答案 0 :(得分:2)

你可以通过浏览可见的单元格并禁用所有这些按钮中的播放按钮来实现它,除了用户刚刚点击的按钮:

class PlayItem {
    // your code
    var isPlaying = false
}

class RadioTableViewCell: UITableViewCell {

    // your code ....

    func setup(item item: PlayItem) {
        image = item.isPlaying ? UIImage(named: "cellPause") : UIImage(named: "cellPlay")
    }
}

在你的代表中:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.cellForRowAtIndexPath(indexPath) as! RadioTableViewCell
    let item = items[indexPath.row] // you may think of storing this array in some kind of view model
    cell.setup(item: item)
    return cell
}

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let selectedCell = tableView.cellForRowAtIndexPath(indexPath) as! RadioTableViewCell
    let selectedItem = items[indexPath.row]
    selectedItem.isPlaying = !selectedItem.isPlaying

    for cell in tableView.visibleCells {
        guard let visibleCell = cell as? RadioTableViewCell else { return }
        let path = tableView.indexPathForCell(visibleCell)
        let item = items[path.row]
        item.isPlaying = visibleCell == selectedCell
        visibleCell.setup(item: item)
    }
}

更新:我已更新我的回答,将回放状态存储在项目中。

答案 1 :(得分:0)

使用MVC模式而不是将数据存储在视图对象或全局(视图控制器)范围中。那么你的生活会更容易。

我认为每一行都应该由模型对象支持。说:

class PlayItem {
    ....
    var isPlaying = false
}

然后是您的cellForRowAtIndexPath方法:

let playItem = self.playItemArray[indexPath.row]
cell.imageView.image = playItem.isPlaying ? UIImage("cellPause") : UIImage("cellPlay")

然后在您的didSelectRowAtIndexPath方法中,更改所选项isPlaying = true和所有其他项isPlaying = false,然后致电tableView.reloadData()。表视图将刷新所有单元格以反映其正确状态。