2010-08-30 4 views
0

Je souhaite contrôler une instance de AVAudioPlayer à partir d'un élément UITableView dans une instance didSelectRowAtIndexPath.didSelectRowAtIndexPath - access tapCount ou similaire

La première pression sur l'élément de ligne déclenche la 'lecture' de l'AVAudioPlayer. La deuxième pression de l'élément de ligne déclenche l'arrêt de l'AVAudioPlayer.

Je peux faire fonctionner le 'jeu' mais je n'arrive pas à faire fonctionner le 'stop'. De même, les touches suivantes de l'élément de ligne commencent un autre fil de l'audio en arrière-plan.

Quelle est la meilleure façon de s'assurer que 1 tap démarre l'audio et qu'un 2ème appui l'arrête?

exemples de code - cette méthode preps fichier audio et AVAudioPlayer pour:

- (void)makeReadyAudio { 
NSString *path = [[NSBundle mainBundle] pathForResource:@"Murderers" ofType:@"mp3"]; 
NSURL *url = [NSURL fileURLWithPath:path]; 
NSError *error; 
musicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error]; 
[musicPlayer prepareToPlay]; 
} 

Ce bloc commencera & arrêter le AVAudioPlayer dans une déclaration de cas dans la section didSelectRowAtIndexPath:

case 7: { 
     //touch to start audio sound playing, touch again to stop playing 
     [self makeReadyAudio]; 
     if ([musicPlayer isPlaying]) { 
      [musicPlayer stop]; 
      NSLog(@"musicPlayer tested to be playing, so stop it."); 
     } else { 
      [musicPlayer play]; 
      NSLog(@"musicPlayer tested to be *not* playing, so play it."); 
     } 
     break; 
    } 

Répondre

1

Que diriez-vous :

- (void) didSelectRowAtIndexPath: 
{ 
    if (player.isPlaying) { 
     [player stop]; 
    } else { 
     [player start]; 
    } 
} 

Dans d'autres mots, gardez le joueur autour et voir ce qu'il fait.

+0

si ([joueur isPlaying]) { \t [joueur arrêt]; \t NSLog (@ "lecteur testé pour jouer, alors arrêtez-le."); } else { \t [jouer au joueur]; \t NSLog (@ "lecteur testé pour être * pas * en train de jouer, alors jouez-le."); } Semblait plausible, mais pas de chance. Même comportement, le «vrai» cas de test ne semble jamais être exécuté. Les touches répétées de la ligne sélectionnée impriment "le lecteur testé pour ne pas * être * en cours de lecture, alors jouez-le" encore et encore dans le journal ... pendant la lecture de l'audio à nouveau. Hmm. – pteeter

+0

Ensuite, montrez plus de code. On dirait que l'erreur est ailleurs. Par exemple, votre code AVAudioPlayer. –

+0

code ajouté à l'énoncé du problème ci-dessus ... Tags balises pris en charge pas très intuitive @ StackOverflow. – pteeter

0

Le problème est que vous appelez makeReadyAudio à chaque fois que la ligne est tapée. Vous devez vérifier si vous l'avez déjà fait. Par exemple en faisant quelque chose comme:

if (musicPlayer == nil) { 
    [self makeReadyAudio]; 
} 
+0

Bien sûr. Ok la prochaine fois que je suis de retour à ma machine de développement, je vais essayer. – pteeter

Questions connexes