我有两个视图控制器
View Controller A
View Controller B
我在View Controller A
中有一个表格视图,列出了四个声音。当用户选择其中一个声音时,应编程View Controller B
中的按钮以播放该声音。
我一直在玩prepareForSeque
和didSelectRowAtIndexPath
并且似乎无法使其中任何一个正常工作。
这样做的最佳方式是什么?
答案 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];