根据表视图选择将功能分配给第二视图控制器中的IOS按钮

时间:2014-08-24 15:48:57

标签: ios objective-c delegates

我有两个视图控制器

  1. View Controller A

  2. View Controller B

  3. 我在View Controller A中有一个表格视图,列出了四个声音。当用户选择其中一个声音时,应编程View Controller B中的按钮以播放该声音。

    我一直在玩prepareForSequedidSelectRowAtIndexPath并且似​​乎无法使其中任何一个正常工作。

    这样做的最佳方式是什么?

1 个答案:

答案 0 :(得分:1)

您必须在didSelectRowAtIndexPath:中跟踪所选的indexPath。一种简单的方法是创建一个属性:

@property (strong, nonatomic) NSIndexPath *selectedIndexPath;

然后将选定的indexPath存储在该属性中,之后调用performSegueWithIdentifier:sender:方法:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
     self.selectedIndexPath = indexPath;
     [self performSegueWithIdentifier:@"SEGUE_ID" sender:nil];
}

prepareForSegue:中从声音数组中获取所选声音:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"SEGUE_ID"])
    {
        ViewControllerB *controller = segue.destinationViewController.
        controller.selectedSound = self.sounds[self.selectedIndexPath.row];
    }
}

这是因为数组的名称是sounds。您必须在视图控制器B中创建一个属性来存储通过segue传递的声音。在名称为SEGUE_ID的场景之间命名一个segue。很明显,您必须根据需要调整代码,我假设您的数组中充满了引用声音名称的NSString对象。因此,最后一块代码中的属性selectedSound必须是NSString。正如我所说,这取决于你的声音阵列的结构。

编辑:根据@jlehr注释,通过删除视图控制器A中的属性,行self.selectedIndexPath = indexPath并使用以下内容获取所选的indexPath,代码可以更简洁代替:

NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
ViewControllerB *controller = segue.destinationViewController.
controller.selectedSound = self.sounds[indexPath.row];