2017-02-16 10 views
1

"yourButton"または "yourButton2"または "yourButton3"を押すと、それぞれオーディオファイルが再生され、オーディオ再生中にUIButtonが選択されます。audioPlayerDidFinishPlayingメソッドで複数のplay()を行う方法

"yourButton4"は、他のUIButtonsのメソッドを1つの行に実装したいと思います。 (最初は、オーディオファイルを再生し、選択した "yourButton"、次に "yourButton2"と "yourButton3"を設定します)。

ただし、 "yourButton4"を押すと、 "yourButton2"と "yourButton3"がplay()メソッドと同時に再生されます。サウンドを非同期で再生します。

 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) 
      } 
     } 

答えて

0

はAppDelegateにのみ1本の代わりにこの使用のVC

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

で異なるこの3を使用しないでください。また、あなたのVCからアクセスしてください。同じ問題はありません。あなたのVCの使用で再び

var player1:AVAudioPlayer? 

このインスタンス

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) 
      } 
     } 
+0

私は感謝を見つけることを試みる! – johnCole

0

あなたは同時にすべてを再生していますが、遅延や前回の終了を待つものはありません。

あなたのクラスはAVAudioPlayerのデリゲートになるはずです。最初に最初のオーディオファイルを再生し、デリゲートコールaudioPlayerDidFinishPlaying:successfully:を受け取ると、次のオーディオファイルを再生します。

あなたはこのような何かを見て、あなたのデリゲートの呼び出しを変更する必要があります。

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! 
      } 
     } 
+0

クラスがすでにAVAudioPlayerのデリゲートであると私ができる:次のオーディオは、前の音声がアプリケーションデリゲートで

使用これを停止します再生されます場合には素早く代理人を呼び出す方法を見つけられない! – johnCole

+0

あなたはデリゲートコールを意味しませんか?デリゲートメソッドで見られる問題は、同じステートメントのすべてのファイルを再生していることです。アクティブなものに応じて異なるif文でそれを再生する必要があります。 –

+0

はい私はそれが問題であることを知っていますが、私はまだ方法がわかりません。あなたは私が「アクティブなものに応じて異なるif文でそれを再生する」についてもっと説明しますか? – johnCole

関連する問題