前提・実現したいこと
SwiftUIにて、音楽再生プレイヤーを作成しています。
曲の再生が終了したときにaudioPlayerDidFinishPlayingの中の処理を行いたいのですが、そもそも呼び出されません。
原因や対処法をご存知の方がいましたら、ご教授いただけると幸いです。
該当のソースコード
・修正前
SwiftUI
1import SwiftUI 2import AVFoundation 3 4var player: AVAudioPlayer? 5 6struct ContentView: View { 7 var body: some View { 8 Button(action: { 9 avp.playSound() 10 }) { 11 Text("再生") 12 } 13 } 14} 15 16class avp:NSObject, AVAudioPlayerDelegate { 17 18 static func playSound() { 19 let soundURL = Bundle.main.url(forResource: "C4_T100", withExtension: "mp3") 20 21 do { 22 player = try AVAudioPlayer(contentsOf: soundURL!) 23 player?.volume = 10 24 player?.prepareToPlay() // 即時再生させる 25 player?.play() // BGMを鳴らす 26 } catch { 27 print("error...") 28 } 29 } 30 31 // 音楽再生が成功した時に呼ばれるメソッド 32 private static func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { 33 print("再生終了") 34 } 35 36 37}
・解決後
SwiftUI
1import SwiftUI 2import AVFoundation 3 4var player: AVAudioPlayer? 5 6struct ContentView: View { 7 var audioPlayer = avp() // 追記 8 9 var body: some View { 10 Button(action: { 11 self.audioPlayer.playSound() //修正 12 }) { 13 Text("再生") 14 } 15 } 16} 17 18class avp:NSObject, AVAudioPlayerDelegate { 19 20 func playSound() { 21 let soundURL = Bundle.main.url(forResource: "C4_T100", withExtension: "mp3") 22 23 do { 24 player = try AVAudioPlayer(contentsOf: soundURL!) 25 player?.delegate = self // 追記 26 player?.volume = 10 27 player?.prepareToPlay() // 即時再生させる 28 player?.play() // BGMを鳴らす 29 } catch { 30 print("error...") 31 } 32 } 33 34 // 音楽再生が成功した時に呼ばれるメソッド 35 func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { // 修正 36 print("再生終了") 37 } 38}
補足情報
Xcode(11.5)
とりあえず、func playSound() からstaticを削除して再生できるようにして下さい。
根が深いです。
/*static*/ func playSound() {
ご返事ありあがとうございます。ご指摘の通りsataticを排除しインスタンスを生成してplaySound()を呼ぶようにしました。
ここをサクっと修正できるならそんなに深くはないですね。
あとはdelegate周りです。
・player?.delegate = self //追加
・/*private static*/ func audioPlayerDidFinishPlaying(...) { //削除
ご指摘の通り修正いたしましたところ、問題なくprint処理が行われました!ありがとうございます!
独学で書籍を見ながらのプログラミングだったため非常に助かりました。
回答1件
あなたの回答
tips
プレビュー