2017-09-12 65 views
0

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

应用萌发过程中由于未捕获的异常 '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?

+0

你应该将'playMusic'的'外playerDidFinishPlaying'。 – the4kman

+0

我搬了它。但仍然是相同的错误。你可以请分享鳕鱼? –

回答

0

由于斯威夫特3,您必须声明Selectors这样的:#selector(playerDidFinishPlaying(email:))和自斯威夫特4必须将@objc属性添加到函数:

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

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

0

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

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

确保您MusicPlayer类设置为这个像这样:

类MusicPlayer:AVAudioPlayerDelegate {