如何根据tableview选择更改按钮的功能?

时间:2014-04-08 20:23:55

标签: ios objective-c cocoa-touch uitableview uibutton

我有一个填充的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);
}

2 个答案:

答案 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]; 

或者在播放声音后将其移动到播放声音的方法中。