【问题标题】:play next song when music when music is finished in iOS swift在iOS swift中播放音乐时播放下一首歌曲
【发布时间】:2017-09-13 03:29:07
【问题描述】:

我正在尝试构建一个音乐应用程序。音乐播放得很完美,但是当音乐播放完时,它没有播放下一首歌曲。我正在寻找这个解决方案。当我尝试一些解决方案时,会给我错误。

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序, 原因:'-[Shironamhin.MusicPlayer playerDidFinishPlaying:]: 无法识别的选择器发送到实例 0x17003d960

我一直在尝试这种方式

class MusicPlayer: NSObject {

    static let player = MusicPlayer()

    //this is global variable
    var player : AVPlayer?
    var playerItem:AVPlayerItem?

    func initPlayer(){
        do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try AVAudioSession.sharedInstance().overrideOutputAudioPort(AVAudioSessionPortOverride.speaker)
            print("AVAudioSession Category Playback OK")
            do {
                try AVAudioSession.sharedInstance().setActive(true)

                print("AVAudioSession is Active")

            } catch let error as NSError {
                print(error.localizedDescription)
            }
        } catch let error as NSError {
            print(error.localizedDescription)
        }
}
    func playMusic(_ musicUrl: String?) {
        if let mm = musicUrl {
            var url: URL!
            url = URL(string: mm)
            playerItem = AVPlayerItem(url: url)
            player = AVPlayer(playerItem: playerItem)
            player?.volume = 1.0
            player?.rate = 1.0
            player?.play()
            NotificationCenter.default.addObserver(self, selector: Selector(("playerDidFinishPlaying:")), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: playerItem)


        }

        func playerDidFinishPlaying(note: NSNotification) {

            print("call")

        }
    }




}

另外我该如何实现这个 playerDidFinishPlaying??

【问题讨论】:

  • 你应该把playerDidFinishPlaying移到playMusic之外。
  • 我移动了它。但仍然是同样的错误。你能分享一下鳕鱼吗??

标签: ios swift


【解决方案1】:

从 Swift 3 开始,您必须像这样声明 Selectors#selector(playerDidFinishPlaying(email:)),而从 Swift 4 开始,您必须在函数中添加 @objc 属性:

@objc func audioDidFinishPlaying(note: NSNotification) {
    print("call")
}

顺便说一句,AVAudioPlayerDelegate 有一个不错的功能:optional func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool),它可能更容易使用。 :)

【讨论】:

    【解决方案2】:

    我同意@user6603599,这就是我使用的。

    func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
        print("\naudioPlayerDidFinishPlaying")
    }
    

    确保你的 MusicPlayer 类是这样设置的:

    类 MusicPlayer: AVAudioPlayerDelegate {

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多