Comment jouer plusieurs () dans la méthode audioPlayerDidFinishPlaying

Quand j'appuie sur "yourButton" ou "yourButton2" ou "yourButton3" chacun lit un file audio et pendant que l'audio est en cours de lecture, l'UIButton est sélectionné.

Je voudrais que "yourButton4" implémente la méthode des autres UIButtons d'affilée. (Dans un premier time, lit un file audio et définit "yourButton" puis "yourButton2" et "yourButton3").

Cependant, lorsque j'appuie sur "yourButton4", "yourButton2" et "yourButton3" sont joués en même time que la méthode play () Lit un son de manière asynchronous.

let url1 = Bundle.main.bundleURL.appendingPathComponent("music1.mp3") let url2 = Bundle.main.bundleURL.appendingPathComponent("music2.mp3") let url3 = Bundle.main.bundleURL.appendingPathComponent("music3.mp3") @IBOutlet weak var yourButton: customButton! @IBOutlet weak var yourButton2: customButton! @IBOutlet weak var yourButton3: customButton! @IBOutlet weak var yourButton4: customButton! fileprivate var player1:AVAudioPlayer? fileprivate var player2:AVAudioPlayer? fileprivate var player3:AVAudioPlayer? @IBAction func pushButton1(sender: UIButton) { Player(url: url1) } @IBAction func pushButton2(sender: UIButton) { Player1(url: url2) } @IBAction func pushButton3(_ sender: UIButton) { Player2(url: url1, url2: url2, url3: url3) } func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { if (player === player1) { yourButton.isSelected = false } else if (player === player2) { yourButton2.isSelected = false } else if (player === player3) { yourButton.isSelected = false player2!.play() yourButton2.isSelected = true player2!.play() yourButton3.isSelected = true player1!.play() } } func Player(url: URL) { do { try player1 = AVAudioPlayer(contentsOf:url) player1!.play() yourButton.isSelected = true player1!.delegate = self } catch { print(error) } } func Player1(url: URL) { do { try player2 = AVAudioPlayer(contentsOf:url) player2!.play() yourButton2.isSelected = true player2!.delegate = self } catch { print(error) } } func Player2(url: URL, url2: URL, url3: URL) { do { try player3 = AVAudioPlayer(contentsOf:url) try player2 = AVAudioPlayer(contentsOf: url2) try player1 = AVAudioPlayer(contentsOf: url3) player3!.play() yourButton.isSelected = true player3!.delegate = self player2!.delegate = self player1!.delegate = self } catch { print(error) } } 

Ne pas utiliser ce 3 différent dans VC

 fileprivate var player1:AVAudioPlayer? fileprivate var player2:AVAudioPlayer? fileprivate var player3:AVAudioPlayer? 

Au lieu de cela, n'utilisez qu'un de ces éléments dans AppDelegate et accédez-y depuis votre VC pour ne pas avoir le même problème. Lorsque l'audio suivant sera joué, l'audio précédent s'arrêtera

Utilisez ceci dans le délégué de l'application:

 var player1:AVAudioPlayer? 

Toujours dans votre CV, utilisez cette instance

 func Player1(url: URL) { do { let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate try appDelegate.player1 = AVAudioPlayer(contentsOf:url) appDelegate.player1!.play() yourButton2.isSelected = true appDelegate.player1!.delegate = self } catch { print(error) } } 

Vous jouez tous en même time, il n'y a pas de retard ou rien n'attend que le précédent se termine.

Votre class doit devenir le délégué de AVAudioPlayer , donc vous devez d'abord lire le premier file audio et une fois que vous obtenez l'appel de délégué audioPlayerDidFinishPlaying:successfully: vous jouez le suivant.

Vous devriez modifier votre appel de délégué pour ressembler à ceci:

 func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { if (player === player1) { player2!.play() } else if (player === player2) { player3!.play() } else if (player === player3) { // You're done! } }