NSMutableArray的索引不以0开头

时间:2017-05-30 09:11:09

标签: ios arrays swift xcode nsmutablearray

我正在尝试将值(文档目录中的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()


    }

1 个答案:

答案 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()
}

希望对你有所帮助。