【发布时间】:2017-05-30 09:11:08
【问题描述】:
我正在尝试将值(文档目录中的 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)
}
另一个视图控制器:
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 那么索引的数量呢?
-
你可能想要
if currentTrack == array.count-1 { //is last track } -
@JamesP 发生同样的崩溃!而且不是标准方式!
-
什么不是标准的?显示崩溃的代码。
标签: ios arrays swift xcode nsmutablearray