AVAudioPlayerDelegate swift не вызывает метод - PullRequest
1 голос
/ 12 июля 2020

Новое в Swift и Xcode - попытка реализовать простой AVAudioPlayerDelegate - но он не запускает метод AudioPlayerDidFinishPlaying - я просмотрел все другие открытые потоки, но я не нашел ответа, который подходил бы для моей проблемы, потому что все выглядит нормально. Кто-нибудь?

import UIKit
import AVFoundation

class ViewController: UIViewController {
    
    var player = AVAudioPlayer()

    override func viewDidLoad() {
         super.viewDidLoad()
         player.delegate = self
     }
    
    @IBAction func keyPressed(_ sender: UIButton) {
        
        sender.alpha = 0.5
        
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
            sender.alpha = 1
        }
        
        let buttonPressed:String = sender.currentTitle!
        playSound(buttonPressed:  buttonPressed)
    }
    
    func playSound(buttonPressed: String) {
        let url = Bundle.main.url(forResource: buttonPressed, withExtension: "wav")
        player = try! AVAudioPlayer(contentsOf: url!)
        player.play()
                
    }
    
  
}

//MARK: - AVAudioPlayerDelegate

extension ViewController: AVAudioPlayerDelegate {
    
    func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
        
        print("completed")
        
    }
    
    func audioPlayerDecodeErrorDidOccur(_ player: AVAudioPlayer, error: Error?) {
        print(error!)
    }
    
}

 

1 Ответ

2 голосов
/ 12 июля 2020

это потому, что вы создаете новый экземпляр AVAudioPlayer после того, как вы установили делегата в представлении didload, он должен быть таким

func playSound(buttonPressed: String) {
        let url = Bundle.main.url(forResource: buttonPressed, withExtension: "wav")
        player = try! AVAudioPlayer(contentsOf: URL!)
        player.delegate = self
        player.play()
                
    }
...