Iphone 更改UITableview中按下的特定按钮的图像

Iphone 更改UITableview中按下的特定按钮的图像,iphone,cocoa-touch,uitableview,uibutton,didselectrowatindexpath,Iphone,Cocoa Touch,Uitableview,Uibutton,Didselectrowatindexpath,我有一个动态的tableview,它有一个带有按钮的原型单元格,当按下按钮时,可以播放歌曲 我希望当用户按下按钮播放歌曲时,按钮上的背景图像变为“停止”图标,当用户再次按下按钮停止歌曲时,按钮上的背景图像变为“播放”图标 为了实现这一点,我一直在尝试使用: [self.beatPlayButton setBackgroundImage:[UIImageImageName:@“play.png”]用于状态:UIControlStateNormal] 我的问题是,自从我使用原型单元格以来,我还没有弄

我有一个动态的tableview,它有一个带有按钮的原型单元格,当按下按钮时,可以播放歌曲

我希望当用户按下按钮播放歌曲时,按钮上的背景图像变为“停止”图标,当用户再次按下按钮停止歌曲时,按钮上的背景图像变为“播放”图标

为了实现这一点,我一直在尝试使用:
[self.beatPlayButton setBackgroundImage:[UIImageImageName:@“play.png”]用于状态:UIControlStateNormal]

我的问题是,自从我使用原型单元格以来,我还没有弄清楚如何只更改正在按下的行中的按钮。我一直希望找到像
didSelectObjectAtRow:atIndexPath:
这样的方法,因为按下行时,
didselectrowatinexpath:
将触发,但不会触发该行上的按钮(除非我弄错了)。也许我应该用标签?我不确定。任何指点都将不胜感激

编辑: 我的代码在
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

按照您的建议使用标记。在
cellforrowatinexpath
方法中,为每个单元格指定一个标记:

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];
        }
     }
}
-(iAction)播放:发送方
{
.........
……其他代码。。。。
UITableViewCell*单元格=(UITableViewCell*)发送方;
对于(int i=0;i<[dataArray count];i++)
{
UITableViewCell*tempCell=[tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i第0节]];
if(tempCell.tag!=cell.tag)
{
[cell.playButton setEnabled:否];
}
}
}

但在执行此操作时,在播放完歌曲后,必须将它们全部设置回启用状态。这将通过MediaPlayer委托方法完成:didFinishPlay

按照您的建议使用标记。在
cellforrowatinexpath
方法中,为每个单元格指定一个标记:

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];
        }
     }
}
-(iAction)播放:发送方
{
.........
……其他代码。。。。
UITableViewCell*单元格=(UITableViewCell*)发送方;
对于(int i=0;i<[dataArray count];i++)
{
UITableViewCell*tempCell=[tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i第0节]];
if(tempCell.tag!=cell.tag)
{
[cell.playButton setEnabled:否];
}
}
}


但在执行此操作时,在播放完歌曲后,必须将它们全部设置回启用状态。这将通过MediaPlayer委托方法完成:didFinishPlay

由于您使用的是target/action,sender参数将包含被点击的按钮。不要将按钮称为self.beatPlayButton,只需使用sender,因此
[sender setBackgroundImage:[UIImage ImageName:@“play.png”]用于状态:UIControlStateNormal]

由于您使用的是目标/操作,sender参数将包含被点击的按钮。不要将按钮称为self.beatPlayButton,只需使用sender,因此
[sender setBackgroundImage:[UIImage ImageName:@“play.png”]用于状态:UIControlStateNormal]

该操作是在
didSelectRowAtIndexPath
中发生的,还是在按钮发送的某个操作中发生的?能否提供一些代码?什么操作与按钮关联?我已更新我的问题以提供更多上下文。谢谢。该操作是在
didSelectRowAtIndexPath
中发生的,还是在按钮发送的某个操作中发生的?您能提供一些代码吗?什么操作与按钮关联?我已更新我的问题以提供更多上下文。谢谢,谢谢我的朋友。在你的帮助下,我可以让它工作。你知道有没有办法禁用与其他标签索引按钮的交互?例如,如果我有5行,并且我按下了标记#2处的按钮,那么标记0-1和3-5处的按钮将被禁用。如果您知道,那么我可以提出另一个问题并放置一个链接,以便您可以回答。@OrpheusMercury我刚刚在原始答案中添加了一些代码,如果有帮助,请告诉我。我相信它应该是有效的,虽然我没有在xcode中测试。谢谢你的建议。我明白你的想法,但实际上我无法让[cell.playButton setEnabled:NO]在cellforrowatindexpath之外工作,因为cell无法识别playButton。我正试图找出替代代码。有什么想法吗?@OrpheusMercury您应该使用cellForRowAtIndexPath方法访问每个单元格,以设置该循环中启用的播放按钮;这对你没用?谢谢我的朋友。在你的帮助下,我可以让它工作。你知道有没有办法禁用与其他标签索引按钮的交互?例如,如果我有5行,并且我按下了标记#2处的按钮,那么标记0-1和3-5处的按钮将被禁用。如果您知道,那么我可以提出另一个问题并放置一个链接,以便您可以回答。@OrpheusMercury我刚刚在原始答案中添加了一些代码,如果有帮助,请告诉我。我相信它应该是有效的,虽然我没有在xcode中测试。谢谢你的建议。我明白你的想法,但实际上我无法让[cell.playButton setEnabled:NO]在cellforrowatindexpath之外工作,因为cell无法识别playButton。我正试图找出替代代码。有什么想法吗?@OrpheusMercury您应该使用cellForRowAtIndexPath方法访问每个单元格,以设置该循环中启用的播放按钮;这对你不起作用?