2009-01-11 9 views

Répondre

2

Vous aurez besoin d'une classe délégué/source de données pour votre vue sélecteur - quelque chose qui implémente les protocoles UIPickerViewDelegate et UIPickerViewDataSource. Cela peut être n'importe quel contrôleur de vue que vous avez gérer tout le reste ou une classe distincte - de toute façon, définissez les propriétés et dataSource de UIPickerView à votre instance de cette classe.

La classe doit avoir trois variables d'instance - un NSArray soundArr pour contenir les sons, un NSTimer timer pour fournir un retard après la sélection avant la lecture du son (plus de détails ci-dessous), et un AVAudioPlayer audioPlayer pour jouer le son sélectionné (pour lequel vous aurez besoin d'importer le framework AVFoundation - il n'est disponible qu'en 2.2, car la lecture du son était beaucoup plus compliquée).

Lorsque vous chargez les sons (dans votre méthode -init de classe contrôleur ou autre), bâton « em dans un tableau avec le titre que vous les voulez afficher, quelque chose comme ceci:

 
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]; 

Le les méthodes que vous aurez besoin de mettre en œuvre sont les suivants:

  • -pickerView:numberOfRowsInComponent: - doit retourner la taille de soundArr
  • -pickerView:titleForRow:forComponent: - devrait revenir [[soundArr objectAtIndex:row] objectForKey:@"title"]
  • -numberOfComponentsInPickerView: - doit retourner 1, puisque vous avez seulement une colonne (composant) pour sélectionner
  • -pickerView:didSelectRow:inComponent: - voir ci-dessous

Vous ne voulez pas le son de démarrer immédiatement lorsque le row- La méthode delegate de sélection est appelée, ou des extraits de sons sont lus en continu lorsque l'utilisateur fait défiler le sélecteur. Au lieu de cela, utilisez une minuterie avec un court délai, quelque chose comme ceci:

 
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 

Ensuite, mettre en œuvre une -startSoundAtURL: méthode qui met en place le AVAudioPlayer à jouer ce son:

 
- (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]; 
} 

Cela devrait à peu près fais le.

Questions connexes