2017-07-17 3 views
0

Ich mache einen Audio-Player nur für einen Test für meine anderen Projekte. I definiert eine Klasse mit dem Namen BackgroundAudio wie folgt:AVAudioPlayer führt zu App-Abstürzen

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) 
} 
} 

In meinem View-Controller, ich die Klasse initialisiert und einige relevante Funktion zu implementieren, indem dies zu tun:

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) { 

} 
} 

Alles funktioniert ganz gut, aber aufgeworfenen Fragen . Das Problem ist das:

Wenn ich die Schaltfläche play angeklickt und es funktioniert, aber wenn ich mute drücken, stürzt das Programm ab. liegt daran, dass die Klasse nicht initialisiert wird, wenn die Stummschaltung vor dem Drücken der Wiedergabetaste gedrückt wird. enter image description here

Wie löst man das? Vielen Dank im Voraus

+0

try Überprüfung 'wenn audioPlayer.isPlaying' – kathayatnk

Antwort

1

Ich denke, in Ihrer Mute-Funktion können Sie prüfen, ob die URL des Audioplyers existiert und ob es nicht einfach zurückgibt. Etwas wie:

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

ich herausfinden, nur die Instanz nicht initialisiert wurde, bevor ich die Mute-Methode aufrufen. Und Ihr Ansatz hilft mir, ein anderes Problem zu lösen. Danke, Mann – Nan