2017-02-12 6 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