是否有用于创建选择短声音文件的UIPickerview的通用模板?

时间:2009-01-11 00:46:25

标签: cocoa-touch audio

是否有一般模板或教程或网页描述创建UIPickerview的过程,该过程选择短声音文件并在选择时播放或播放?感谢

1 个答案:

答案 0 :(得分:2)

您的选择器视图需要一个委托/数据源类 - 实现协议UIPickerViewDelegateUIPickerViewDataSource的东西。这可以是您处理其他所有内容的视图控制器或单独的类 - 无论哪种方式,将UIPickerView的{​​{1}}和delegate属性设置为该类的实例。< / p>

该类应该有三个实例变量 - 一个用于包含声音的NSArray dataSource,一个NSTimer soundArr用于在声音播放之前选择后提供延迟(下面有更多内容),以及一个AVAudioPlayer timer播放选定的声音(您需要导入AVFoundation框架 - 它仅在2.2中可用,因为声音播放过去要复杂得多)。

当您第一次加载声音时(在您的控制器类的-init方法或其他任何方法中),将它们与您希望它们显示的标题一起放在一个数组中,如下所示:

NSBundle *bdl = [NSBundle mainBundle];
soundArr = [[NSArray alloc] initWithObjects:[NSDictionary dictionaryWithObjectsAndKeys:@"Sound One",@"title",[NSURL URLWithString:[bdl pathForResource:@"sound1" ofType:@"wav"]],@"url",nil],
[NSDictionary dictionaryWithObjectsAndKeys:@"Sound Two",@"title",[NSURL URLWithString:[bdl pathForResource:@"sound2" ofType:@"wav"]],@"url",nil],
nil];

您需要实施的方法是:

  • audioPlayer - 应返回-pickerView:numberOfRowsInComponent:
  • 的大小
  • soundArr - 应该返回-pickerView:titleForRow:forComponent:
  • [[soundArr objectAtIndex:row] objectForKey:@"title"] - 应返回1,因为您只有一列(组件)可供选择
  • -numberOfComponentsInPickerView: - 见下文

您不希望在调用行选择委托方法时立即启动声音,或者在用户滚动选择器时连续播放声音片段。相反,使用延迟很短的计时器,如下所示:

if(timer != nil)
{
    [timer invalidate]; // remove any timer from an earlier selection
    timer = nil;
}
timer = [NSTimer scheduledTimerWithTimeInterval:0.4 target:self selector:@selector(startSoundAtURL:) userInfo:[[soundArr objectAtIndex:row] objectForKey:@"url"] repeats:NO]; // and create the new one

然后,实现一个-startSoundAtURL:方法,设置AVAudioPlayer播放该声音:

- (void)startSoundAtURL:(NSURL *)url
{
    if(audioPlayer != nil)
    {
        [audioPlayer stop];
        [audioPlayer release];
    }
    NSError *err;
    audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&err];
    if(err != nil)
    {
        NSLog([err description]);
        return;
    }
    [audioPlayer play];
}

那几乎应该这样做。