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

Posted

技术标签:

【中文标题】更改在 UITableview 中按下的特定按钮的图像【英文标题】:Change the image of a specific button pressed in a UITableview 【发布时间】:2012-07-02 18:20:19 【问题描述】:

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

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

为了实现这一点,我一直在尝试使用: [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

【问题讨论】:

动作是发生在didSelectRowAtIndexPath还是按钮发送的某个动作中? 你能提供一些代码吗?什么动作与按钮相关联? 我已更新我的问题以提供更多上下文。谢谢。 【参考方案1】:

按照您的建议使用标签。在你的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) 

     

::EDIT:: (回复评论)

要禁用其他按钮,请在您的播放方法中:

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

【讨论】:

谢谢我的朋友。在您的帮助下,我得以完成这项工作。 您知道是否有办法禁用与其他标签索引处的按钮交互?例如,如果我有 5 行并且我按下了标签 #2 处的按钮,那么标签 0-1 和 3-5 处的按钮将被禁用。如果您知道,那么我可以提出另一个问题并放置一个链接,以便您回答。 @OrpheusMercury 我刚刚在我的原始答案中添加了一些代码,如果有帮助,请告诉我。我相信它应该是有效的,但我没有在 xcode 中测试。 感谢您的建议。我知道您对此的看法,但实际上我无法让 [cell.playButton setEnabled:NO] 在 cellforrowatindexpath 之外工作,因为单元格无法识别 playButton。我正在尝试找出替代代码。有什么想法吗? @OrpheusMercury 您应该可以使用 cellForRowAtIndexPath 方法访问每个单元格以设置在该循环中启用的播放按钮;这不适合你?【参考方案2】:

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

【讨论】:

以上是关于更改在 UITableview 中按下的特定按钮的图像的主要内容,如果未能解决你的问题,请参考以下文章

通过在另一个 ViewController 中按下按钮/在另一个 ViewController 中引用 UITableView 创建 UITableViewCell

根据按下的按钮更改表格视图标题

在 iOS 中按下特定按钮时播放特定声音

如何禁用在android片段类中按下的后退按钮

使用 TouchableHighlight 在 React Native 中按下时如何更改按钮颜色?

在 SwiftUI 中按下按钮时更改字符串的文本