Вам понадобится класс делегата / источника данных для представления выбора - то, что реализует протоколы UIPickerViewDelegate
и UIPickerViewDataSource
. Это может быть любой контроллер представления, с которым вы работаете, или отдельный класс - в любом случае, установите свойства UIPickerView
s delegate
и dataSource
для вашего экземпляра этого класса.
В классе должно быть три переменных экземпляра: NSArray soundArr
для хранения звуков, NSTimer timer
для обеспечения задержки после выбора перед воспроизведением звука (подробнее об этом ниже) и AVAudioPlayer audioPlayer
для воспроизвести выбранный звук (для которого вам нужно будет импортировать инфраструктуру 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];
Методы, которые вам нужно реализовать:
-pickerView:numberOfRowsInComponent:
- должен вернуть размер soundArr
-pickerView:titleForRow:forComponent:
- должен вернуться [[soundArr objectAtIndex:row] objectForKey:@"title"]
-numberOfComponentsInPickerView:
- должен возвращать 1, поскольку у вас есть только один столбец (компонент) для выбора из
-pickerView:didSelectRow:inComponent:
- см. Ниже
Вы не хотите, чтобы звук начинался немедленно, когда вызывается метод делегата для выбора строки, или фрагменты звуков будут воспроизводиться непрерывно, когда пользователь прокручивает средство выбора. Вместо этого используйте таймер с небольшой задержкой, примерно так:
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];
}
Это должно в значительной степени сделать это.