我有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)
}
}
由于
答案 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)。