如何在 Swift 游乐场播放完歌曲后调用函数
How to call function when song finished in a Swift Playground
我正在尝试在 Swift 操场上播放完一首歌曲时调用一个函数。这是我正在使用的代码:
NotificationCenter.default.addObserver(self, selector: Selector(("playerDidFinishPlaying:")), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: winMusic)
但是歌曲播放完后并没有调用该函数,不知道为什么?这显然与 iOS 应用中的不同。
var winMusic = NSURL(fileURLWithPath: Bundle.main.path(forResource: "win", ofType: "mp3")!)
var winPlayer: AVAudioPlayer? = nil
class Responder : NSObject {
func playerDidFinishPlaying() {
print("test")
/* Nothing printed here */
}
func action(sender: UIButton) {
NotificationCenter.default.addObserver(self, selector: #selector(Responder.playerDidFinishPlaying), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: winMusic)
NotificationCenter.default.post(name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil)
winPlayer!.play()
}
}
AVAudioPlayer 不会post AVPlayerItemDidPlayToEndTime 通知。你需要给玩家一个委托。参见 https://developer.apple.com/reference/avfoundation/avaudioplayerdelegate/1389160-audioplayerdidfinishplaying
将您的 winPlayer
委托设置为,
winPlayer?.delegate = self
并实现方法
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
if flag == true {
// song finished successfully here
}
}
放置代表的位置由您决定。
我正在尝试在 Swift 操场上播放完一首歌曲时调用一个函数。这是我正在使用的代码:
NotificationCenter.default.addObserver(self, selector: Selector(("playerDidFinishPlaying:")), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: winMusic)
但是歌曲播放完后并没有调用该函数,不知道为什么?这显然与 iOS 应用中的不同。
var winMusic = NSURL(fileURLWithPath: Bundle.main.path(forResource: "win", ofType: "mp3")!)
var winPlayer: AVAudioPlayer? = nil
class Responder : NSObject {
func playerDidFinishPlaying() {
print("test")
/* Nothing printed here */
}
func action(sender: UIButton) {
NotificationCenter.default.addObserver(self, selector: #selector(Responder.playerDidFinishPlaying), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: winMusic)
NotificationCenter.default.post(name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil)
winPlayer!.play()
}
}
AVAudioPlayer 不会post AVPlayerItemDidPlayToEndTime 通知。你需要给玩家一个委托。参见 https://developer.apple.com/reference/avfoundation/avaudioplayerdelegate/1389160-audioplayerdidfinishplaying
将您的 winPlayer
委托设置为,
winPlayer?.delegate = self
并实现方法
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
if flag == true {
// song finished successfully here
}
}
放置代表的位置由您决定。