如何在UITableViewCell中更改以前按下的UIButton标签?

时间:2014-12-01 18:19:37

标签: ios xcode uitableview swift

我有UITableView标签和一个显示音频列表的按钮。

按钮标有" Play"按下它变为"停止"播放音频,如果在其他单元格中按下另一个按钮,则上一个单元格按钮应该将其标签更改为"播放"。

现在,我在这里遇到的问题是如何将之前的单元格按钮更改回" play"吗

标签是UITableViewCell中的出口,UIButton以编程方式添加cellForRowAtIndexPath

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("SongTitleCell", forIndexPath: indexPath) as SongsTableViewCell

    let songDic : NSDictionary = arrSongs.objectAtIndex(indexPath.row) as NSDictionary

    cell.lblSongTitle.text = songDic.objectForKey("SongTitle") as? String


    btnPlayPause = UIButton(frame : CGRectMake(13,2,40,40))
    btnPlayPause.tag = indexPath.row
    btnPlayPause.setTitle("Play", forState: UIControlState.Normal)
    btnPlayPause.addTarget(self, action: "cellSongClicked:", forControlEvents: UIControlEvents.TouchUpInside)

    cell.contentView.addSubview(btnPlayPause)

    return cell
}

按钮的动作在这里:

func cellSongClicked (sender : AnyObject ){
    var remote = GetSongData()
    remote.delegate = self

    var btnCurrentPressed = sender as UIButton

    //Play Selected Song
    let songDic : NSDictionary = arrSongs.objectAtIndex(btnCurrentPressed.tag) as NSDictionary

    if (btnCurrentPressed.currentTitle == "Play") {

      remote.PlaySelectedSong(songDic.objectForKey("SongURL") as String!)
      btnCurrentPressed.setTitle("Stop", forState: UIControlState.Normal)

    } else {
      playerContoller.stop()
      btnCurrentPressed.setTitle("Play", forState: UIControlState.Normal)
    }

}

由于

1 个答案:

答案 0 :(得分:2)

我会使用这个策略:

1)保存包含您班级属性中当前播放歌曲的单元格的索引路径(您知道" cellSongClicked"操作中的UIButton标签中的新indexPath)

2)" cellForRowAtIndexPath"将按钮的标题设置为" Play"或"停止"取决于这是当前播放歌曲的单元格

3)当按下一个按钮时,刷新当前正在播放的歌曲单元格和新的播放歌曲单元格并调用它们#34; reloadRowsAtIndexPaths"

希望这有帮助

编辑代码详情:

1)每次按钮都不要重新分配。它必须是SongsTableViewCell类的另一个出口(与标签相同)。并从Interface Builder中设置目标/操作(在#34; func cellSongClicked"和ctrl-drag from IB)前添加@IBAction

2)将以下属性添加到您的类中:

private var currentSong : Int?

3)方法cellForRowAtIndexPath:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("SongTitleCell", forIndexPath: indexPath) as SongsTableViewCell

    let songDic : NSDictionary = arrSongs.objectAtIndex(indexPath.row) as NSDictionary

    cell.lblSongTitle.text = songDic.objectForKey("SongTitle") as? String
    cell.btnPlayPause.tag = indexPath.row

    var title : String
    if let _currentSong = currentSong {
        title = indexPath.row == _currentSong ? "Stop" : "Play"
    } else {
        title = "Play"
    }
    cell.btnPlayPause.setTitle(title, forState: UIControlState.Normal)

    return cell
}

4)行动:

@IBAction func cellSongClicked (sender : AnyObject ){
    var remote = GetSongData()
    remote.delegate = self

    var btnCurrentPressed = sender as UIButton

    //Play Selected Song
    let songDic : NSDictionary = arrSongs.objectAtIndex(btnCurrentPressed.tag) as NSDictionary

    var rowsToReload = [NSIndexPath]()
    var stopCurrent = false
    if let _currentSong = currentSong {
        if btnCurrentPressed.tag == _currentSong {
            stopCurrent = true
        } else {
            rowsToReload.append(NSIndexPath(forRow: _currentSong, inSection:0))
        }
    }
    rowsToReload.append(NSIndexPath(forRow: btnCurrentPressed.tag, inSection:0))
    currentSong = stopCurrent ? nil : btnCurrentPressed.tag
    self.tableView.reloadRowsAtIndexPaths(rowsToReload, withRowAnimation: .None)
}

编辑:为当前歌曲添加了停止

检查用户是否正在点击当前播放按钮(if btnCurrentPressed.tag == _currentSong)。在这种情况下,不要重新加载该行(否则你将重新加载它两次)并将currentSong属性设置为nil(使用temp boolean stopCurrent)。