Существует ли общий шаблон для создания UIPickerview, который выбирает короткие звуковые файлы? - PullRequest
1 голос
/ 11 января 2009

Существует ли общий шаблон или учебник или веб-страница, описывающая процедуру создания UIPickerview, которая выбирает короткие звуковые файлы и воспроизводит их при выборе или с помощью проигрывателя? Спасибо

1 Ответ

2 голосов
/ 11 января 2009

Вам понадобится класс делегата / источника данных для представления выбора - то, что реализует протоколы 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];
}

Это должно в значительной степени сделать это.

...