如何根据 tableview 选择更改按钮的功能?
Posted
技术标签:
【中文标题】如何根据 tableview 选择更改按钮的功能?【英文标题】:How can I change a button's function based on a tableview selection? 【发布时间】:2014-04-08 20:23:55 【问题描述】:我有一个填充的 tableview 以及一个播放声音的按钮。我希望该按钮根据在 table view 中选择的内容播放不同的声音。
如何在按下按钮时检索表格视图中选择的行?有没有更好的方法来做到这一点?
谢谢,代码如下:
-(void)viewDidLoad
[super viewDidLoad];
NSURL *buttonURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"applause_y" ofType:@"wav"]];
AudioservicesCreateSystemSoundID((__bridge CFURLRef)buttonURL,
&SoundID);
NSArray *array = [[NSArray alloc] initWithObjects:@"Sleepy", @"Sneezy",
@"Bashful", @"Happy", @"Doc", @"Grumpy", @"Dopey", @"Thorin", @"Dorin", @"Nori", @"Ori", @"Balin", @"Dwalin", @"Fili", @"Kili", @"Oin", @"Gloin", @"Bifur", @"Bofur", @"Bombur", nil];
self.listData = array;
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
NSUInteger row = [indexPath row];
NSString *rowValue = [listData objectAtIndex:row];
NSString *message = [[NSString alloc] initWithFormat: @"You selected %@", rowValue];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Row Selected!"
message:message
delegate:nil cancelButtonTitle:@"Yes I Did"
otherButtonTitles:nil];
[alert show];
[tableView deselectRowAtIndexPath:indexPath animated:YES];
//Button that plays sound
- (IBAction)Button:(id)sender
AudioServicesPlaySystemSound(SoundID);
【问题讨论】:
更新您的Button
方法(顺便说一句 - 方法名称应以小写字母开头)以将声音 id 基于当前选定的行。
完成。感谢 rmaddy 的提示。
【参考方案1】:
更好的方法是更改数据源以将每个项目与声音相关联。
所以不是数组,而是一对值的数组
self.listData = [[NSArray alloc] initWithObjects:
@@"mood":@"Sleepy", @"sound":@"applause_y",
@@"mood":@"Sneezy", @"sound":@"sound_a",
@@"mood":@"Bashful", @"sound":@"sound_b",
@@"mood":@"Happy", @"sound":@"sound_c",
//and so forth
];
您的计数不会改变:
[self.listData count];
但是您检索数据的方式会有所不同:
[[self.listData objectAtIndex:indexPath.row]objectForKey:@"mood"];
在您的 IBAction 中,您无权访问 indexPath,因此为了获得声音,您必须从 tableView 中获得:
NSIndexPath *indexPath = [tableView indexPathForSelectedRow];
[[self.listData objectAtIndex:indexPath.row]objectForKey:@"sound"];
但请注意 didSelectedRow 中的最后一行代码,您可能需要将其注释掉。
//[tableView deselectRowAtIndexPath:indexPath animated:YES];
或者把它移到你播放声音的方法上,当然是在播放完之后。
【讨论】:
为此,我是否也必须在我的 .h 文件中声明一个 tableView 属性? 不,除非你没有使用 UITableViewController ,你可以只做 self.tableView 完美工作 谢谢 meda 和 Rob。【参考方案2】:在您的 IBAction 中,您应该能够调用 [myTableView indexPathForSelectedRow]
并使用它来决定播放什么声音。
在这种情况下,我猜您的表格有 1 个部分,其中包含一堆行,因此您可以使用 [listData objectAtIndex:[[myTableView indexPathForSelectedRow] row]]
来获取您的一个 Dwarf 名称,例如。
【讨论】:
显然 myTableView 不是字面意思。你必须使用一些你已经拥有的属性才能在这个 View Controller 的视图中获取 tableview。以上是关于如何根据 tableview 选择更改按钮的功能?的主要内容,如果未能解决你的问题,请参考以下文章
根据选择更改 UITableViewCell 中按钮的背景颜色