如何在 Swift Playground 中完成歌曲时调用函数

Posted

技术标签:

【中文标题】如何在 Swift Playground 中完成歌曲时调用函数【英文标题】:How to call function when song finished in a Swift Playground 【发布时间】:2017-03-13 02:56:22 【问题描述】:

我正在尝试在 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()
    

【问题讨论】:

好的,如何发布通知? 你能分享你的游乐场代码吗? 好的@DaveWeston,代码已发布。 好的,也发了。 【参考方案1】:

AVAudioPlayer 不会发布 AVPlayerItemDidPlayToEndTime 通知。你需要给玩家一个委托。见https://developer.apple.com/reference/avfoundation/avaudioplayerdelegate/1389160-audioplayerdidfinishplaying

【讨论】:

【参考方案2】:

将您的 winPlayer 委托设置为,

winPlayer?.delegate = self

并实现方法

func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) 
    if flag == true 
        // song finished successfully here
    

代表的位置由您决定。

【讨论】:

第一行应该放在哪里?我正在尝试放入“动作”功能,但我收到一条错误消息,提示“无法将类型'Responder'的值分配给类型'AVAudioPlayerDelegate'”,我不能将它放在Responder类之外,否则我得到一个未解决的标识符错误。 也许,在Responder 类的init 方法中。但小心delegate 期望UIVIewController 我建议,在 Responder 类中创建一个自定义委托。让父控制器处理委托。 没有 UIViewController。这是一个游乐场。 如果你不介意,@x4h1d 你能用一些示例代码解释一下吗,因为我没有听懂你所说的关于自定义委托的内容,我真的被困在这个问题上。跨度>

以上是关于如何在 Swift Playground 中完成歌曲时调用函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在Playground中运行异步回调

如何在 Playground 中使用 Swift 包管理器

如何在 Playground 中导入 Swift 包?

如何使用 Swift 在 Playground 中获取用户交互事件

如何在 Swift Playground 中使用更新功能

如何检查 Playground 的 swift 版本?