2017-02-20 3 views
1

habe ich drei AVAudioPlayer erstellt, die jeweils eine Audiodatei abspielen. Während das Audio abgespielt wird, wird der UIButton von audioPlayerDidFinishPlaying ausgewählt.Mit nur einem AVAudioPlayer statt drei

Da ich drei verschiedene AVAudioPlayer verwenden möchte, möchte ich nur einen AVAudioPlayer für die Effizienz von Code verwenden.

Wenn ich jedoch versuche, Code mit nur einem AVAudioPlayer neu zu schreiben, kann ich audioPlayerDidFinishPlaying nicht verwenden, um mehr als einen UIButtons auszuwählen.

Wie kann ich dieses Problem lösen?

Hier ist der Code mit drei verschiedenen 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

Bitte meine Antwort überprüfen und lassen Sie mich wissen, wenn Sie irgendwelche Zweifel haben hinsichtlich der Umsetzung – KrishnaCA

Antwort

2

Sie können eine Ganzzahl verwenden, um zwischen verschiedenen derzeit wiedergegebenen Dateien zu unterscheiden. Ich habe Ihren Code in der Frage geändert und ihn unten geschrieben. Bitte werfen Sie einen Blick auf sie und sagen Sie mir, wenn Sie irgendwelche Zweifel haben

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

Danke so viel perfekt es hat geklappt !! – johnCole

Verwandte Themen