2017-02-16 13 views
1

Когда я нажимаю «yourButton» или «yourButton2» или «yourButton3», каждый воспроизводит звуковой файл, и во время воспроизведения звука выбран UIButton.Как многократное воспроизведение() в методе audioPlayerDidFinishPlaying

Я хотел бы, чтобы «yourButton4» реализовал метод других UIButtons в строке. (Сначала воспроизводит аудиофайл и устанавливает выбранный «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

Не используйте этот 3 отличается в VC

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

Вместо этого использования только одного этого в AppDelegate и получить доступ к нему из вашего VC, чтобы у вас не было такой же проблемы. Когда следующий звук будет играть предыдущий звук будет остановить

Используйте это в App делегат:

var player1:AVAudioPlayer? 

Снова в вашем использовании VC этот экземпляр

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

Да, я знаю, что это проблема, но я до сих пор не знаю, как это сделать. Объясните ли вы мне больше о том, «сыграете ли это в разных утверждениях в соответствии с активным»? – johnCole