ios - 如何更改 UITableViewCell 中先前按下的 UIButton 标签?

标签 ios xcode uitableview swift

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

一旦按下标有“播放”的按钮,它就会变为“停止”并播放音频,如果在其他单元格中按下另一个按钮,则前一个单元格按钮应该将其标签更改为“播放”。

现在,我遇到的问题是如何将之前的单元格按钮改回“播放”?

标签是 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
}

这里按钮的 Action :

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) 在您的类的一个属性中维护包含当前播放歌曲的单元格的索引路径(您从“cellSongClicked”操作中的 UIButton 标签知道新的 indexPath)

2) 在“cellForRowAtIndexPath”中,将按钮的标题设置为“播放”或“停止”,具体取决于当前播放歌曲的单元格

3) 按下按钮时刷新当前播放的歌曲单元格和调用它们的新播放歌曲单元格“reloadRowsAtIndexPaths”

希望对你有帮助

编辑代码详情:

1) 不要每次都重新分配按钮。它必须是 SongsTableViewCell 类的另一个导出(与标签相同)。并从 Interface Builder 设置目标/操作(在“func cellSongClicked”前面添加 @IBAction 并从 IB 按住 ctrl 拖动)

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) 和 Action :

@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)。

关于ios - 如何更改 UITableViewCell 中先前按下的 UIButton 标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27234684/

相关文章:

ios - 创建一个有默认值的数组,但是默认值被改变了

iphone - Xcode UIWebView 本地 HTML

ios - 无法将类型 '(Either<NestedType>) -> Void' 的值转换为预期的参数类型 '(Either<[_]>) -> Void'

ios - UITableview 和异步请求

ios - UITableViewAutomaticDimension 引起的问题

ios - 如何在同一类中为不同的选择器使用 viewForRow 和 titleForRow?

iPhone 设备上的 C 套接字崩溃。 EXC_BAD_ACCESS

ios - 在 iOS 中获取设备位置(仅限国家/地区)

xcode - 如何将标题信息插入 MPMoviePlayerController url?

ios - UITableViewCell 高度问题