2017-02-12 83 views
1

我創建的UIButton與上MainStoryBoard的圖像。當我按下該按鈕時,它將播放一個音頻文件,而在播放音頻時,UIButton的背景顏色會發生變化。如何使用audioPlayerDidFinishPlaying多次

audioPlayerDidFinishPlaying1正確調用,但是audioPlayerDidFinishPlaying2似乎不會被調用。我感謝任何意見,導致我解決這個問題。

let url1 = Bundle.main.bundleURL.appendingPathComponent("music1.mp3") 
    let url2 = Bundle.main.bundleURL.appendingPathComponent("music2.mp3") 

    @IBOutlet weak var yourButton: CustomButton! 
    @IBOutlet weak var yourButton2: CustomButton! 

    func Player(url: URL) { 
     do { 
      try player = AVAudioPlayer(contentsOf:url) 
      player.play() 
      yourButton.isSelected = true 
      player.delegate = self 
     } catch { 
      print(error) 
     } 
    } 

    func Player1(url: URL) { 
     do { 
      try player = AVAudioPlayer(contentsOf:url) 
      player.play() 
      yourButton2.isSelected = true 
      player.delegate = self 
     } catch { 
      print(error) 
     } 
    } 
    @IBAction func pushButton1(sender: UIButton) { 
     Player(url: url1) 
    } 
    func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { 
     yourButton.isSelected = false 

    } 

    @IBAction func pushButton2(sender: UIButton) { 
     Player1(url: url2) 
    } 
    func audioPlayerDidFinishPlaying2(_ player: AVAudioPlayer, successfully flag: Bool) { 
     yourButton2.isSelected = false 
    } 

回答

1

您在Player1/Player方法中本地創建播放器。所以當方法結束時,玩家將被釋放。保留生成的播放器作爲一個類的成員,所以它不會被釋放時,方法退出

在你的類添加:

class YourClass 
{ 
    let url1 = Bundle.main.bundleURL.appendingPathComponent("music1.mp3") 
    let url2 = Bundle.main.bundleURL.appendingPathComponent("music2.mp3") 

    @IBOutlet weak var yourButton: CustomButton! 
    @IBOutlet weak var yourButton2: CustomButton! 

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

    . 
    . 
    . 

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

另一件事..你使用的是委託方法audioPlayerDidFinishPlaying這是一個委託方法AVAudioPlayer。然而audioPlayerDidFinishPlaying2不是這樣在這裏沒用。由於您有兩名玩家,其中一名作爲代表,您需要確定哪名玩家已完成並更改了正確的按鈕。

func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { 
    if (player === player1) { 
     yourButton.isSelected = false 
    } else if (player === player2) { 
     yourButton2.isSelected = false 
    } 
} 
+0

您是否介紹瞭如何編寫「讓生成的播放器成爲類成員」? – risa8

+0

@ risa8看到我編輯的答案。 – giorashc

+0

@ risa8檢查我編輯的答案。你可以去掉方法audioPlayerDidFinishPlaying2。閱讀說明 – giorashc