2017-09-12 8 views
0

私は音楽アプリを作りようとしていました。音楽は完全には再生されていますが、音楽が終了すると次の曲を再生しません。私はこの解決策を探していた。私はいくつかの解決策が私にエラーを与えるのだと尻を試してみるとき。 [Shironamhin.MusicPlayer playerDidFinishPlaying:]: 認識されていないセレクタがインスタンスに0x17003d960音楽が終わったときに次の曲を再生するiOS swiftで音楽が終了したら

を送った私は、このよう

をしようとしていた - 」: 'NSInvalidArgumentException'、 理由によりキャッチされない例外にアプリをerminating

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 {

関連する問題