Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Swift游乐场中完成歌曲时调用函数_Swift_Xcode_Swift3_Avplayer_Swift Playground - Fatal编程技术网

如何在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你能用一些示例代码解释一下吗?因为我没有听你说的关于自定义委托的内容,我真的被困在这个问题上了。