如何在 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 [关闭]
如何将文本包装在 Iphone 的 UITable 单元格中?