値(ドキュメントディレクトリからの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()
}
"player.MP3DirectoryFiles.count'は次のようにする必要があります。1意味:0,1"、実際には配列に2つのオブジェクトが含まれているため、カウントは2になります。 –
@ JamesPだからインデックスの数は? –
もしあなたがたぶん 'currentTrack == array.count-1 {//は最後のトラック}'としたいでしょう。 –