我有一个动态的tableview,它有一个带有按钮的原型单元格,按下时会播放一首歌曲。
当用户按下按钮播放歌曲时,我希望按钮上的背景图像变为“停止”图标,当用户按下按钮时,它会变为“播放”图标再次停止这首歌。
要做到这一点,我一直在尝试使用:
[self.beatPlayButton setBackgroundImage:[UIImageimageNamed:@"play.png"]forState:UIControlStateNormal];
我的问题是,由于我正在使用原型单元格,因此我还没有想出如何仅更改正在按下的行中的按钮。我一直希望找到像didSelectObjectAtRow:atIndexPath:
这样的方法,因为didSelectRowAtIndexPath:
会在按下行时触发,但不会触发按钮(除非我弄错了)。也许我应该使用标签?我不确定。任何指针都将非常感激。
编辑:
我的代码不在didSelectRowAtIndexPath
。
以下是示例代码 -
- (IBAction)playStopBeat:(UIButton*)sender event:(id)event {
NSSet *touches = [event allTouches];
UITouch *touch = [touches anyObject];
CGPoint currentTouchPosition = [touch locationInView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint: currentTouchPosition];
if([self.audioPlayer isPlaying])
{
[self.beatPlayButton setBackgroundImage:[UIImage imageNamed:@"play.png"]forState:UIControlStateNormal];
[self.audioPlayer stop];
self.isPlaying = NO;
self.audioPlayer = nil;
}
else {
if (indexPath.row == 0) {
[self.beatPlayButton setImage:[UIImage imageNamed:@"stop.png"] forState: UIControlStateNormal];
}
else if (indexPath.row == 1){
[self.beatPlayButton setBackgroundImage:[UIImage imageNamed:@"stop.png"]forState:UIControlStateNormal];
}
else if (indexPath.row == 2){
...
//code to play song
答案 0 :(得分:2)
像你建议的那样使用标签。在cellForRowAtIndexPath
方法中,为每个单元格添加标记:
cell.tag = indexPath.row;
还在细胞上设置每个目标:
[cell.playButton addTarget:self action:@selector(play:)forControlEvents:UIControlEventTouchUpInside];
然后在您的播放方法中,使用您的阵列标签或w / e:
- (IBAction)play:sender
{
UITableViewCell *cell = (UITableViewCell *)sender;
NSLog(@"tag = %d", cell.tag);
if(tag == 0)
{
//you could also use a switch statement
} else if(tag == 1) {
}
}
::编辑::(回答评论)
要在播放方法中禁用其他按钮:
- (IBAction)play:sender
{
.........
....other code....
UITableViewCell *cell = (UITableViewCell *)sender;
for(int i = 0; i < [dataArray count]; i++)
{
UITableViewCell *tempCell = [tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]];
if(tempCell.tag != cell.tag)
{
[cell.playButton setEnabled:NO];
}
}
}
在这样做的过程中,在完成歌曲播放后,您必须将它们全部设置为启用。这将在MediaPlayers委托方法中完成:didFinishPlaying。
答案 1 :(得分:2)
由于您正在使用目标/操作,因此sender参数将包含被点击的按钮。而不是将按钮称为self.beatPlayButton,只需使用发件人,所以[sender setBackgroundImage:[UIImage imageNamed:@"play.png"] forState:UIControlStateNormal];