2

我有一个动态桌面视图,其中有一个按钮,当按下时播放歌曲的原型单元格。更改在UITableview中按下的特定按钮的图像

我想要按钮上的背景图像,当用户按下按钮播放歌曲时变为“停止”图标,并且当用户按下它时变为“播放”图标再一次阻止这首歌。

要做到这一点,我一直在试图使用方法: [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

是在'didSelectRowAtIndexPath'中发生的操作还是在按钮发送的某些操作中? –

+0

你能提供一些代码吗?什么动作与按钮相关联? – sergio

+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) { 

    } 
} 

::编辑::(回答评论)

要禁用其他按钮,在你的PLA y方法:

- (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。

+0

感谢我的朋友。我能够得到这个工作与你的帮助。 –

+0

你知不知道是否有一种方法可以禁止与其他标签索引处的按钮进行交互?例如,如果我有5行,并且我在标签#2处按下按钮,则标签0-1和3-5处的按钮将被禁用。如果你知道,那么我可以提出另一个问题,并给它一个链接,以便你可以回答它。 –

+0

@OrpheusMercury我只是给我的原始答案添加了一些代码,让我知道是否有帮助。我相信它应该是有效的,但我没有在xcode中测试。 – RyanG

2

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

+0

我意识到这一点并对其进行了调整。你是绝对正确的。 +1 –