如何从swift中的文档目录获取特定文件的NSURL

我在NSFileManager的帮助下从文档目录中获取文件。 我有一个文件名数组,我可以将它们传递给另一个控制器。 我仍然希望从我的UITableViewCell传递特定文件的NSURL ,因为我传递了这些文件的名称。 我的文件是mp3。 请帮帮我。

  var listOfMP3Files: Array? // for Cell data func fetchFilesFromFolder() { var fileManager = NSFileManager.defaultManager() var folderPathURL = fileManager.URLsForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask)[0] as! NSURL var documentsContent = fileManager.contentsOfDirectoryAtPath(folderPathURL.path!, error: nil) println(documentsContent) if var directoryURLs = fileManager.contentsOfDirectoryAtURL(folderPathURL, includingPropertiesForKeys: nil, options: NSDirectoryEnumerationOptions.SkipsHiddenFiles, error: nil) { println(directoryURLs) var mp3Files = directoryURLs.map(){ $0.lastPathComponent }.filter(){ $0.pathExtension == "mp3" } listOfMP3Files = mp3Files println(mp3Files) } } override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { var playerVC = (segue.destinationViewController as! UINavigationController).topViewController as! AVPlayerVC var indexPath = tableView.indexPathForSelectedRow() var objectForPass = listOfMP3Files![indexPath!.row] // default if segue.identifier == "listenMusic" { playerVC.object = objectForPass } } 

更新

我更新了我的代码,我可以获得jpg类型的文件。 但我不知道如何获取mp3文件。

我的更新代码

  override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { var playerVC = (segue.destinationViewController as! UINavigationController).topViewController as! PlayMusicViewController var indexPath = tableView.indexPathForSelectedRow() var objectForPass = listOfMP3Files![indexPath!.row] // default // var path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as? String var getImage = path?.stringByAppendingPathComponent(objectForPass) var image = UIImage(contentsOfFile: getImage!) if segue.identifier == "listenMusic" { playerVC.musicFile = objectForPass playerVC.end = image } } 

UPDATE2我编辑了我的代码,我可以在mp3文件上传递NSURL ,在另一个UIViewController我可以播放它们。

下面是一个编辑过的代码

  override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { var playerVC = (segue.destinationViewController as! UINavigationController).topViewController as! PlayMusicViewController var indexPath = tableView.indexPathForSelectedRow() var objectForPass = listOfMP3Files![indexPath!.row] // default // /* var path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as? String var getImage = path?.stringByAppendingPathComponent(objectForPass) var image = UIImage(contentsOfFile: getImage!) */ // var fileM = NSFileManager.defaultManager() var wayToFile = fileM.URLsForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask) var passMusicFileURL: NSURL? if let documentPath: NSURL = wayToFile.first as? NSURL { let musicFile = documentPath.URLByAppendingPathComponent(objectForPass) println(musicFile) passMusicFileURL = musicFile } if segue.identifier == "listenMusic" { // playerVC.musicFile = objectForPass playerVC.end = passMusicFileURL } } 

在单独的中间语句中创建完整文件URL,您将发现问题。

如果你没有独立的语句调试很难。

folderPathURL.path不正确。

首先创建整个文件路径,然后从中创建f文件URL。

例:

 let name = "aFileName" var filePath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first as! String println("\nfilePath: \(filePath)") filePath = filePath.stringByAppendingPathComponent(name) println("\nfilePath: \(filePath)") var filePathURL = NSURL.fileURLWithPath(filePath) println("\nfilePathURL: \(filePathURL!)") 

输出:

filePath:/ Users / zaph / Library / Developer / CoreSimulator / Devices / 264B31F6-3A28-4C75-9205-3558BBF54DED / data / Containers / Data / Application / 0048403F-C8DE-4EE7-83CF-6AE7CCBAF090 / Documents

filePath:/ Users / zaph / Library / Developer / CoreSimulator / Devices / 264B31F6-3A28-4C75-9205-3558BBF54DED / data / Containers / Data / Application / 0048403F-C8DE-4EE7-83CF-6AE7CCBAF090 / Documents / aFileName

filePathURL:file:/// Users / zaph / Library / Developer / CoreSimulator / Devices / 264B31F6-3A28-4C75-9205-3558BBF54DED / data / Containers / Data / Application / 0048403F-C8DE-4EE7-83CF-6AE7CCBAF090 / Documents / aFileName

使用中间语句可以validation每个步骤。

我找到了解决问题的方法

  override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { var playerVC = (segue.destinationViewController as! UINavigationController).topViewController as! PlayMusicViewController var indexPath = tableView.indexPathForSelectedRow() var objectForPass = listOfMP3Files![indexPath!.row] // default // /* var path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as? String var getImage = path?.stringByAppendingPathComponent(objectForPass) var image = UIImage(contentsOfFile: getImage!) */ // var fileM = NSFileManager.defaultManager() var wayToFile = fileM.URLsForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask) var passMusicFileURL: NSURL? if let documentPath: NSURL = wayToFile.first as? NSURL { let musicFile = documentPath.URLByAppendingPathComponent(objectForPass) println(musicFile) passMusicFileURL = musicFile } if segue.identifier == "listenMusic" { // playerVC.musicFile = objectForPass playerVC.end = passMusicFileURL } }