我有一个填充的tableview以及一个播放声音的按钮。我希望按钮能够播放不同的声音,具体取决于在表格视图中选择的内容。
如何在按下按钮时检索在表格视图中选择的行?有更好的方法吗?
谢谢,以下是代码:
-(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);
}
答案 0 :(得分:0)
在您的IBAction中,您应该只需拨打[myTableView indexPathForSelectedRow]
并使用它来决定要播放的声音。
在这种情况下,我猜你的桌子有1个部分,有一堆行,所以你可以拿[listData objectAtIndex:[[myTableView indexPathForSelectedRow] row]]
来获得你的一个矮人名字。
答案 1 :(得分:0)
更好的方法是更改数据源,将每个项目与声音相关联。
因此,它不是数组,而是一对配对值
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];
或者在播放声音后将其移动到播放声音的方法中。