Ich versuche, Werte (MP3-Dateien aus dem Dokumentverzeichnis) zu NSMutableArray
hinzuzufügen. Ich erstelle einen Musik-Player. Wenn ein Song fertig ist, sollte meine Methode den nächsten Song über AVAudioPlayer Delegate
abspielen. Ich schrieb eine if
Anweisung und prüft, ob die aktuelle Spur größer als ist, sollte es erste Lied spielen, deren Index 0
ist.Index von NSMutableArray startet nicht mit 0
Das Problem ist, App abstürzt aufgrund dieses Fehlers: fatal error: Array index out of range
Dann drucke ich meine Array und etwas Seltsames geschieht hier:
print("all files are :\(player.MP3DirectoryFiles.count)")
print("all files :\(player.MP3DirectoryFiles.description)")
alle Dateien: 2
alle Dateien :("Kuchen durch The Ocean.mp3", "LoveSong.mp3")
Es scheint, dass das Zählen OK ist! Es gibt 2
Dateien, aber das Problem ist Index des Arrays beginnt mit 0
so in diesem Fall player.MP3DirectoryFiles.count
sollte sein: 1
was bedeutet: 0,1
. [IN TABLE VIEW]
Ich muss sagen, alles funktioniert gut in der Tabellenansicht, um Zellen auszuwählen und Lieder abzuspielen, aber nachdem die Musik fertig ist, passiert das. ich brauche etwas Hilfe dieses Problem zu beheben hier mehr Code ist, wenn es hilft:
2 Editiert:
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)
}
Another 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' sollte sein: 1 was bedeutet: 0,1 ", eigentlich sollte die Anzahl 2 sein, da das Array 2 Objekte enthält. –
@JamesP also was ist mit der Anzahl der Indizes? –
Sie wollen wahrscheinlich 'wenn currentTrack == array.count-1 {// ist der letzte Track}' –