如何根据 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 中按钮的背景颜色

如何根据单元格数量更改滚动视图大小?

根据布尔值更改按钮图像

想从下拉列表中选择选项并根据所选选项更改按钮的标题...如何?

Swift 3.0 TableView 单元格按钮

调整 TableView 菜单按钮