我有带有标签和按钮的 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/