2017-02-20 11 views
1

Я создал три AVAudioPlayer, каждый из которых воспроизводит аудиофайл. Во время воспроизведения звука UIButton устанавливается в соответствии с настройкой audioPlayerDidFinishPlaying.Использование только одного AVAudioPlayer вместо трех

При использовании трех разных AVAudioPlayer, я хотел бы использовать только один AVAudioPlayer для эффективности кода.

Однако, когда я пытаюсь переписать код только с одним AVAudioPlayer, я не могу использовать audioPlayerDidFinishPlaying для установки более одного выбранного UIButtons.

Как я могу решить эту проблему?

Вот код с тремя различными AVAudioPlayer.

 let url1 = Bundle.main.bundleURL.appendingPathComponent("audioFile1.mp3") 
     let url2 = Bundle.main.bundleURL.appendingPathComponent("audioFile2.mp3") 
     let url3 = Bundle.main.bundleURL.appendingPathComponent("audioFile3.mp3") 


     @IBOutlet weak var yourButton1: customButton! 
     @IBOutlet weak var yourButton2: customButton! 
     @IBOutlet weak var yourButton3: customButton! 


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


     @IBAction func pushButton1(sender: UIButton) { 
      audioPlayer1(url: url1) 
     } 

     @IBAction func pushButton2(sender: UIButton) { 
      audioPlayer2(url: url2) 
     } 

     @IBAction func pushButton3(_ sender: UIButton) { 
      audioPlayer3(url: 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) { 
       yourButton3.isSelected = true 
      } 
     } 

     func audioPlayer1(url: URL) { 
      do { 
       try player1 = AVAudioPlayer(contentsOf:url) 
       player1!.play() 
       yourButton1.isSelected = true 
       player1!.delegate = self 
      } catch { 
       print(error) 
      } 
     } 

     func audioPlayer2(url: URL) { 
      do { 
       try player2 = AVAudioPlayer(contentsOf:url) 
       player2!.play() 
       yourButton2.isSelected = true 
       player2!.delegate = self 

      } catch { 
       print(error) 
      } 
     } 

    func audioPlayer3(url: URL) { 
      do { 
       try player3 = AVAudioPlayer(contentsOf:url) 
       player3!.play() 
       yourButton3.isSelected = true 
       player3!.delegate = self 

      } catch { 
       print(error) 
      } 
     } 
+0

Пожалуйста, проверьте мой ответ и дайте мне знать, если у вас есть какие-либо сомнения по поводу реализации – KrishnaCA

ответ

2

Вы можете использовать целое число, чтобы идентифицировать различные файлы, воспроизводимые в данный момент. Я изменил ваш код, указанный в вопросе, и написал его ниже. Пожалуйста, посмотрите на него и скажите мне, если у вас есть какие-либо сомнения

let url1 = Bundle.main.bundleURL.appendingPathComponent("audioFile1.mp3") 
let url2 = Bundle.main.bundleURL.appendingPathComponent("audioFile2.mp3") 
let url3 = Bundle.main.bundleURL.appendingPathComponent("audioFile3.mp3") 

@IBOutlet weak var yourButton1: UIButton! 
@IBOutlet weak var yourButton2: UIButton! 
@IBOutlet weak var yourButton3: UIButton! 

fileprivate var lonelyPlayer:AVAudioPlayer? 
var currentPlayer: Int = 0 

@IBAction func pushButton1(sender: UIButton) { 
    if self.lonelyPlayer == nil { 

    }else { 
     if (self.lonelyPlayer?.isPlaying)! { 
      self.lonelyPlayer?.stop() 
     } 
    } 
    audioPlayer(url: url1, buttonId: 1) 
} 

@IBAction func pushButton2(sender: UIButton) { 
    if self.lonelyPlayer == nil { 

    }else { 
     if (self.lonelyPlayer?.isPlaying)! { 
      self.lonelyPlayer?.stop() 
     } 
    } 
    audioPlayer(url: url2, buttonId: 2) 
} 

@IBAction func pushButton3(_ sender: UIButton) { 
    if self.lonelyPlayer == nil { 

    }else { 
     if (self.lonelyPlayer?.isPlaying)! { 
      self.lonelyPlayer?.stop() 
     } 
    } 
    audioPlayer(url: url3, buttonId: 3) 
} 

func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { 
    if (self.currentPlayer == 1) { 
     yourButton1.isSelected = false 
    } else if (self.currentPlayer == 2) { 
     yourButton2.isSelected = false 
    } else if (self.currentPlayer == 3) { 
     yourButton3.isSelected = false 
    } 
} 

func audioPlayer(url: URL, buttonId: Int) { 
    do { 
     try lonelyPlayer = AVAudioPlayer(contentsOf:url) 
     lonelyPlayer!.play() 
     lonelyPlayer!.delegate = self 
     yourButton1.isSelected = (buttonId == 1) 
     yourButton2.isSelected = (buttonId == 2) 
     yourButton3.isSelected = (buttonId == 3) 
     currentPlayer = buttonId 
    } catch { 
     print(error) 
    } 
} 
+0

Спасибо так много он работал отлично !! – johnCole