2017-07-17 1 views
0

Je fais un lecteur audio juste pour un test pour mes autres projets. je définissais une classe nommée BackgroundAudio comme suit:Le problème d'AVAudioPlayer mène aux plantages de l'application

class BackgroundAudio: NSObject,AVAudioPlayerDelegate { 

var audioPlayer = AVAudioPlayer() 

override init() { 
    super.init() 

} 

func play(audioOfUrl:URL) { 


    let urlPath = audioOfUrl 

    do { 
     audioPlayer = try AVAudioPlayer.init(contentsOf: urlPath) 
     audioPlayer.delegate = self 
     audioPlayer.play() 
    } catch let error { 
     print(error.localizedDescription) 
    } 
} 

func stop() { 
    audioPlayer.stop() 
} 

func mute() { 
    audioPlayer.setVolume(0, fadeDuration: 2) 
} 

func unMute() { 
    audioPlayer.setVolume(1, fadeDuration: 2) 
} 
} 

Dans mon View Controller, j'initialisés la classe et mettent en place une fonction peu pertinente en faisant ceci:

class ViewController: UIViewController { 

var urlPath = Bundle.main.url(forResource: "Focus", withExtension: "mp3")! 
var backgroundAudio:BackgroundAudio? 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    backgroundAudio = BackgroundAudio() 
} 

@IBAction func playButtonTapped(_ sender: Any) { 

    backgroundAudio?.play(audioOfUrl: urlPath) 
} 

@IBAction func stopButtonTapped(_ sender: Any) { 
    backgroundAudio?.stop() 
} 

@IBAction func muteButtonTapped(_ sender: Any) { 
    backgroundAudio?.mute() 
} 

@IBAction func unMuteButtonTapped(_ sender: Any) { 

} 
} 

Tout fonctionne très bien, mais questions soulevées . Le problème est le suivant:

Si j'ai cliqué sur le bouton play et que cela fonctionne, mais si j'appuie sur le bouton mute, le programme plante. est-ce parce que la classe n'est pas initialisée quand la sourdine est pressée avant que le bouton de lecture ne soit pressé. enter image description here

Comment résoudre ceci? Merci d'avance

+0

essayer de vérifier le 'si audioPlayer.isPlaying' – kathayatnk

Répondre

1

Je suppose que dans votre fonction de sourdine, vous pouvez vérifier l'existence de l'URL audioplyer et si elle est nulle retour. Quelque chose comme:

if audioPlayer.url != nil { do Stuff } else { do nothing } 
+0

je figure juste en dehors de l'instance n'a pas été initialisé avant d'appeler la méthode mute. Et votre approche m'aide à résoudre un autre problème. Merci mec – Nan