如何在 OBJECTIVE C 的 UITableViewCell 中更改先前按下的 UIButton 标签?

Posted

技术标签:

【中文标题】如何在 OBJECTIVE C 的 UITableViewCell 中更改先前按下的 UIButton 标签?【英文标题】:How to change previously pressed UIButton label in UITableViewCell in OBJECTIVE C? 【发布时间】:2018-03-27 09:57:35 【问题描述】:

我有一个带有两个文本字段的按钮(用于播放/暂停)的表格视图。 同时单击 cell1 的播放。按钮文本正在播放,歌曲正在播放。

但我想在单击单元格 2 或任何其他单元格时将按钮文本从播放更改为暂停。

一旦按下标有“播放”的按钮,它就会变为“暂停”并播放音频,如果在其他单元格中按下另一个按钮,则前一个单元格按钮应该将其标签更改为“播放”。

这意味着我想根据我们在音乐播放器上看到的播放/暂停来更改按钮文本/图像..请帮助

这是我写的。请让我下一步该怎么做:

块引用

========更新答案:

- (IBAction)playCallBack:(id)sender  
    UIButton *clickedBtn = (UIButton*)sender;
    NSIndexPath *indexPath =[self.tableView indexPathForCell: 
   (UITableViewCell *)[[sender superview] superview]];
    NSLog(@"indexpath %ld",(long)indexPath.row);


if (_playBtn != nil && _playBtn != (UIButton*)sender) 
    [_playBtn setTitle:@"Play" forState:UIControlStateNormal];   
     
    if (!player)
    

    NSString *path=[[NSBundle mainBundle] 
    pathForResource:@"iphone_6_original" ofType:@"mp3"];  
    NSURL *url=[NSURL URLWithString:path];  
    player=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:NULL];  
   [player setDelegate:self];
   [player prepareToPlay];
   

    if(_playBtn == clickedBtn)
   
    if ([player isPlaying])
    
    [clickedBtn setTitle:@"Play" forState:UIControlStateNormal];
    [player pause];
    

else
    
    [clickedBtn setTitle:@"Pause" forState:UIControlStateNormal];
    [player play];            
   
   

else
    
    if ([player isPlaying]) 
    player.currentTime = 0;
    [player play];
    [clickedBtn setTitle:@"Pause" forState:UIControlStateNormal];
    

else
   [player play];
   [clickedBtn setTitle:@"Pause" forState:UIControlStateNormal];
   
   
   _playBtn = (UIButton*)sender;
   [_tableView reloadData];    
    

【问题讨论】:

听说过 didSelectRow 吗? :) 您可以在 ViewController 中定义一个属性,并根据该属性更改单元格按钮文本,使用 tableView.reloadData() @ios 你的问题解决了吗? 还没有完全......你建议的代码将单元格的按钮都更改为暂停......而且歌曲也停止了......但我想实现......当我点击下一个单元格的播放按钮,之前播放的按钮将暂停,当前按钮将在播放.. 请edit您的问题删除答案并将其移至实际答案;突出显示您的答案与接受的答案之间的差异。如果与以下答案之一相同,请删除并接受答案。 【参考方案1】:
- (IBAction)playCallBack:(id)sender 

    NSIndexPath *indexPath =[self.tableView indexPathForCell:(UITableViewCell *)[[sender superview] superview]];
    NSLog(@"indexpath %ld",(long)indexPath.row);

    if (!player)
    

        NSString *path=[[NSBundle mainBundle] pathForResource:@"iphone_6_original" ofType:@"mp3"];
        NSURL *url=[NSURL URLWithString:path];
        player=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:NULL];
        [player setDelegate:self];
        [player prepareToPlay];

    
    if (![player isPlaying])
    
        [sender setTitle:@"Play" forState:UIControlStateNormal];
        [player play];
    
    else
    
        [player pause];
        [sender setTitle:@"Pause" forState:UIControlStateNormal];
    

[tableview reloadData];

如果您在按下按钮时重新加载。然后获取当前索引

  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    
        static NSString *tableViewIdentifier=@"cell";
        TableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:tableViewIdentifier];

        if (cell==nil)
        
            cell=[[TableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:tableViewIdentifier];
        

        cell.musicName.text=[musicList objectAtIndex:indexPath.row];
        cell.singer.text=[singerList objectAtIndex:indexPath.row];
        cell.duration.text=[durationList objectAtIndex:indexPath.row];
    if(currentIndex==indexpath.row)
         
//do
           
        else
       
        //or change anything
         
        [cell.playBtn addTarget:self action:@selector(playCallBack:) forControlEvents:UIControlEventTouchUpInside];

        return  cell;
    

【讨论】:

【参考方案2】:

创建新的UIButton

@property (strong, nonatomic) UIButton *currentButton;

然后在action方法中

- (IBAction)playCallBack:(id)sender 

    NSIndexPath *indexPath =[self.tableView indexPathForCell:(UITableViewCell *)[[sender superview] superview]];
    NSLog(@"indexpath %ld",(long)indexPath.row);

    UIButton *clickedBtn = (UIButton*)sender;

    if (self.currentButton != nil && self.currentButton != clickedBtn) 
        [self.currentButton setTitle:@"Play" forState:UIControlStateNormal];
    

    if (!player)
    

        NSString *path=[[NSBundle mainBundle] pathForResource:@"iphone_6_original" ofType:@"mp3"];
        NSURL *url=[NSURL URLWithString:path];
        player=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:NULL];
        [player setDelegate:self];
        [player prepareToPlay];

    


    if(self.currentButton == clickedBtn)
        if ([player isPlaying])
        
            [sender setTitle:@"Play" forState:UIControlStateNormal];
            [player pause];
        
        else
        
            [player play];
            [sender setTitle:@"Pause" forState:UIControlStateNormal];
        
    else
        if ([player isPlaying]) 
            [player pause];
        

        player.currentTime = 0;
        [player play];
    

    self.currentButton = (UIButton*)sender;

这样您可以保持以前的点击按钮,并在点击另一个按钮时根据您的要求进行更改

【讨论】:

感谢您的回答..但是当我点击第二个单元格上的播放时,它会将点击的按钮和之前点击的按钮都更改为暂停..并且歌曲也会通过这次点击暂停. 因为你的玩家逻辑不正确,你必须改变逻辑 那该怎么办?【参考方案3】:
- (IBAction)buttonClicked:(id)sender 
yourButton.backgroundColor = [UIColor blackColor];

【讨论】:

我想根据点击另一个单元格的播放来改变按钮文字 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。

以上是关于如何在 OBJECTIVE C 的 UITableViewCell 中更改先前按下的 UIButton 标签?的主要内容,如果未能解决你的问题,请参考以下文章

将 NSArray 传递给 UITable View 而不是 UILabel [关闭]

Objective-C 字典键按降序排序

如何将文本包装在 Iphone 的 UITable 单元格中?

如何在代码中使用 UItable 单元中的按钮插座

目标 C:如果将标签添加到单元格,则 UITable 方法“didSelectRowAtIndexPath”不起作用

如何在 UITable 中实现 Instagram 评论的效果?