2015-07-19 126 views
0

NSFileManager獲取文檔目錄中的文件。我得到了一組文件名,我可以將它們傳遞給另一個控制器。仍然我想從我的UITableViewCell的特定文件通過NSURL,因爲我傳遞了這些文件的名稱。我的文件是MP3。請幫幫我。如何在swift中從文檔目錄中的特定文件獲取NSURL

var listOfMP3Files: Array<String!>? // 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 
    } 
} 

UPDATE

我更新了我的代碼,我可以得到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 我編輯我的代碼,我可以通過NSURL的MP3文件,而在另一個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 
     } 
    } 

回答

1

我發現我的問題的解決方案

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

創建一個單獨的中間語句完整的文件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!)") 

輸出:

文件路徑:/用戶/ zaph /庫/開發商/ CoreSimulator /設備/ 264B31F6-3A28-4C75-9205-3558BBF54DED /數據/容器/數據/應用/ 0048403F-C8DE-4EE7-83CF-6AE7CCBAF090 /文檔

文件路徑:/用戶/ zaph /庫/開發商/ CoreSimulator /設備/ 264B31F6-3A28-4C75-9205-3558BBF54DED /數據/集裝箱/數據/應用程序/ 0048403F-C8DE-4EE7-83CF-6AE7CCBAF0 90/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

使用中間語句可以驗證每個步驟。

相關問題