2017-05-30 7 views
0

値(ドキュメントディレクトリからのMP3ファイル)をNSMutableArrayに追加しようとしています。私は音楽プレーヤーを作成していますので、曲が終了したら私の方法はAVAudioPlayer Delegateで次の曲を再生する必要があります。私はifステートメントを書いて、現在のトラックがarray.countより大きいかどうかをチェックします。インデックスが0の最初の曲を再生する必要があります。 fatal error: Array index out of rangeその後、私は印刷NSMutableArrayのインデックスが0から始まらない

私のアレイとの奇妙な何かがここに起こっている:

print("all files are :\(player.MP3DirectoryFiles.count)") 
print("all files :\(player.MP3DirectoryFiles.description)") 

すべてのファイルは、次のとおりです。すべて2

問題は、このエラーのアプリがクラッシュしていますファイル:(「Cake By The Ocean.mp3」、「LoveSong.mp3」)

それは数えているようですOKです! 2ファイルがありますが、問題は配列のインデックスであり、0で始まります。この場合、player.MP3DirectoryFiles.countは、1の意味になります。つまり、0,1です。 [表の中の表]

セルを選択して曲を再生するには、テーブルビューですべてがうまく動作すると言いますが、音楽が終了したら、それが起こります。 私はそれが助け場合はより多くのコードで、ここでこの問題を解決するためにいくつかの助けを必要とする:

EDITED 2:

func playMusic(at:Int) { 

     let musicFile = MP3DirectoryFiles[at] as! NSString 

     let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! 
     let musicURL = documentsDirectory.appendingPathComponent(musicFile.lastPathComponent) 

     getDataFromTrack(file: musicURL) 

     do { 

      player = try AVAudioPlayer(contentsOf: musicURL) 
      player.prepareToPlay() 
      player.delegate = self 
      appDefaults.setTrack(duration: Float(player.duration)) 


     } catch let error as NSError { 

      print(error.description) 
     } 


    } 



    func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { 

     NotificationCenter.default.post(name: NSNotification.Name("musicIsFinished"), object: nil) 
    } 

別のViewController:

func musicIsFinished(notification:Notification) { 

     _trackRow = appDefaults.loadTrackNumber() 


     if _trackRow > player.MP3DirectoryFiles.count { 

      _trackRow = 0 


     } else { 

      _trackRow! += 1 

     } 

       player.playMusic(at: _trackRow!) 
       prepareToPlay() 


    } 
+2

"player.MP3DirectoryFiles.count'は次のようにする必要があります。1意味:0,1"、実際には配列に2つのオブジェクトが含まれているため、カウントは2になります。 –

+0

@ JamesPだからインデックスの数は? –

+0

もしあなたがたぶん 'currentTrack == array.count-1 {//は最後のトラック}'としたいでしょう。 –

答えて

2

[OK]を、ので、あなたは2曲を持っていますあなたの配列で。

あなたは位置0で曲を再生する...と言う最初の曲再生を開始(あなたが既に知っているよう... NSMutableArraysがゼロをベースとしているように:))

曲があなたのmusicIsFinished方法がある終了するとと呼ばれる。

次に再生するものを確認します。

if _trackRow > player.MP3DirectoryFiles.count { 
    _trackRow = 0 
} else { 
    _trackRow! += 1 
} 

ですから、elseで終わる:それはあなただけの演奏曲で、player.MP3DirectoryFiles.countはあなたのコードは次のようになります。2.

であるため、現時点_trackRow

は0です。 _trackRowが増加し、次はあなたがplaySong(at: 1)に尋ねると、それは(私は願っています:))

OK働く...次の曲が行われている1

今であり、我々は戻ってmusicIsFinishedでねます。_trackRowは1であるとplayer.MP3DirectoryFiles.countだから、あなたがもう一度チェックし、まだ2

です:

if _trackRow > player.MP3DirectoryFiles.count

それはそう_trackRowが2にインクリメントされないが、その後、あなたは、インデックス2であなたの歌を与えるためにあなたの配列を頼みます

でも...インデックス2の曲はありません。あなたの配列はゼロベースなので、インデックス0とインデックス1では曲を持っていますが、インデックス2ではそうではありません。あなたのアプリは混乱してクラッシュします。あなたが尋ねるあなたif _trackRow > player.MP3DirectoryFiles.countの周りに、代わりを有効にする必要があり

ことを意味

if _trackRow < player.MP3DirectoryFiles.count - 1

:あなたはmusicIsFinishedを入力最初時間はあなたが

以来 else部分で終わる

  • _trackRowは0
  • player.MP3DirectoryFiles.count - 1は1

と0あなたが

  • _trackRow以来if一部に終わるの周り時間は1
  • player.MP3DirectoryFiles.count - 1されている1

    よりも小さいです1

と1は、私が知っている1

長い話より小さくはありませんが、あなたのこれまでmusicIsFinished変更してみてください:あなたを助け

func musicIsFinished(notification:Notification) { 
    _trackRow = appDefaults.loadTrackNumber() 

    if _trackRow < player.MP3DirectoryFiles.count - 1 { 
     _trackRow += 1 
    } else { 
     _trackRow = 0 
    } 
    player.playMusic(at: _trackRow!) 
    prepareToPlay() 
} 

希望を。

+0

ご協力ありがとうございます!それは今うまく動作します –

+0

@ Mc.Loverあなたがうまく動作して:) – pbodsk

関連する問題