我正在尝试将值(文档目录中的MP3文件)添加到NSMutableArray
。我正在创建一个音乐播放器,所以当一首歌完成后,我的方法应该通过AVAudioPlayer Delegate
播放下一首歌。我写了一个if
语句并检查当前曲目是否大于array.count
它应播放的第一首曲目是0
。
由于此错误,问题是应用崩溃:fatal error: Array index out of range
然后我打印我的阵列,这里发生了一些奇怪的事情:
print("all files are :\(player.MP3DirectoryFiles.count)")
print("all files :\(player.MP3DirectoryFiles.description)")
所有文件都是:2
所有文件:(" Cake By the Ocean.mp3"," LoveSong.mp3")
好像还算好!有2
个文件,但问题是数组的索引以0
开头,所以在这种情况下player.MP3DirectoryFiles.count
应该是:1
,这意味着:0,1
。 [见表格]
我必须说在桌面视图中一切正常以选择单元格和播放歌曲,但音乐结束后会发生这种情况。 我需要一些帮助来解决这个问题,如果它有帮助,可以使用更多代码:
已编辑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()
}
答案 0 :(得分:2)
好的,你的阵列中有两首歌。
当你开始播放你说的第一首歌时...在第0位播放歌曲(NSMutableArrays
为零基于......你已经知道:))
歌曲结束后,您的musicIsFinished
方法即被调用。
在这里,您可以查看接下来要播放的内容。
目前_trackRow
为0,因为这是您刚刚播放的歌曲,而player.MP3DirectoryFiles.count
是2。
您的代码如下所示:
if _trackRow > player.MP3DirectoryFiles.count {
_trackRow = 0
} else {
_trackRow! += 1
}
所以你最终进入else
。 _trackRow
增加,现在为1.
接下来你问playSong(at: 1)
这是有效的(我希望:))
好的......下一首歌已经完成,我们回到musicIsFinished
。 _trackRow
为1,player.MP3DirectoryFiles.count
仍为2
所以,你再次检查:
if _trackRow > player.MP3DirectoryFiles.count
不是_trackRow
增加到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小于1
你身边的第二次时间结束于if
部分
_trackRow
是1 player.MP3DirectoryFiles.count - 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()
}
希望对你有所帮助。