2017-05-30 115 views
0

我想將值(MP3文件從文檔目錄)添加到NSMutableArray。我正在創建一個音樂播放器,所以當一首歌曲完成時,我的方法應該通過AVAudioPlayer Delegate播放下一首歌曲。我寫了一個if聲明並檢查當前曲目是否大於array.count它應該播放第一首歌,其索引是0NSMutableArray的索引不是以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。 [IN TABLE VIEW]

我不得不說在桌面視圖中一切正常,選擇單元格和播放歌曲,但音樂完成後發生。 我需要一些幫助,在這裏解決這個問題是更多的代碼,如果有幫助:

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) 
    } 

另一個視圖控制器:

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」,實際上count應該是2,因爲數組包含2個對象。 –

+0

@JamesP那麼索引數量呢? –

+0

你可能想'如果currentTrack == array.count-1 {//是最後一首歌曲}' –

回答

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)和工作(我希望:))

OK ......下一首歌曲完成,我們回到musicIsFinished_trackRow是1 player.MP3DirectoryFiles.count依然是200

所以,你再次檢查:

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

希望幫助你。

+0

感謝您的幫助!它現在工作正常 –

+0

@ Mc.Lover很高興你得到它的工作:) – pbodsk

相關問題