如何在Swift游乐场中完成歌曲时调用函数
当一首歌在快速的操场上播放完毕时,我试图调用一个函数。这是我正在使用的代码:如何在Swift游乐场中完成歌曲时调用函数,swift,xcode,swift3,avplayer,swift-playground,Swift,Xcode,Swift3,Avplayer,Swift Playground,当一首歌在快速的操场上播放完毕时,我试图调用一个函数。这是我正在使用的代码: NotificationCenter.default.addObserver(self, selector: Selector(("playerDidFinishPlaying:")), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: winMusic) 但是,当歌曲播放结束时,函数没有被调用,我不知道为什么?这显然与iOS应用程序不同
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不会发布AVPlayerItemDidPlayToEndTime通知。你需要给玩家一个代理。请参见将您的
winPlayer
委托设置为
winPlayer?.delegate = self
并实现了该方法
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
if flag == true {
// song finished successfully here
}
}
你将把代表放在哪里取决于你。好的,我如何发布通知?你能分享你的操场代码吗?好的@Davewston,代码已发布。好的,也已发布。我将通知放在哪里?我试图输入“action”函数,但我得到一个错误,它说“无法将'Responder'类型的值分配给'AVAudioPlayerDelegate'类型,并且我不能将其放置在Responder类之外,否则我会得到一个未解决的标识符错误。可能,在
Responder
类的init
方法中。但是仔细的delegate
需要一个UIVIewController
。我建议在Responder
类中创建一个自定义委托。让父控制器处理委托。没有UIViewController。这是一个游乐场。如果你不介意的话,@x4h1d你能用一些示例代码解释一下吗?因为我没有听你说的关于自定义委托的内容,我真的被困在这个问题上了。