2

我有一个动态表格视图,它有一个带有按钮的原型单元格,按下时会播放一首歌曲。

我希望按钮上的背景图像在用户按下按钮播放歌曲时更改为“停止”图标,并在用户再次按下按钮停止时更改为“播放”图标这首歌。

为此,我一直在尝试使用: [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
4

2 回答 2

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。

于 2012-07-03T00:02:36.283 回答
2

由于您使用的是目标/操作,因此 sender 参数将包含被点击的按钮。而不是将按钮称为self.beatPlayButton,只需使用sender,所以[sender setBackgroundImage:[UIImage imageNamed:@"play.png"] forState:UIControlStateNormal];

于 2012-07-03T00:14:12.190 回答