2016-09-16 9 views
2

私はこれに夢中になります。私はそこにブレークポイントを置いてチェックした例NSFileManager fileExistsAtPathは、セグの後に2つの異なるクラスの同じパスに対してtrueとfalseを返します(そしてファイルが存在する)

"/var/mobile/Media/DCIM/100APPLE/IMG_0045.JPG" 

ために、アルバム内の画像を一覧表示し、それらのそれぞれについて、NSURLを取得するクラスを持って、ファイルには、すべてが良いですが存在します。

これらのURLを保存します。ユーザーアクションでは、別のクラスを呼び出してイメージの1つを表示し、そのURLを新しいView Controllerに属性として渡します。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "picDetailsSegue" { 
     if let picReviewController = segue.destinationViewController as? PicReviewViewController 
     { 
      if(clickedPicture != nil) 
      { 
       picReviewController.existingFilePath = clickedPicture.urlPath.path! 
       [initialize other stuff...] 
      } 
     } 
    } 
} 

しかし一度そこに、

NSFileManager.defaultManager().fileExistsAtPath(thePath!) 

はただfalseを返す続けます。 NSURLオブジェクトの "path"属性と "relativePath"属性を使用して、パスを文字列として渡すような、たくさんの調整を試みました。オンラインで見つけられるすべての提案、何も動作しません。ファイルが見つからず、次は常にnilを返します。

let image = UIImage(contentsOfFile: theURL.path!) 

コンソール出力:

私はURLにアクセスし、それを格納初めて:

(lldb) print NSFileManager.defaultManager().fileExistsAtPath(url!.path!) 
(Bool) $R1 = true 
(lldb) print url!.path 
(String?) $R3 = "/var/mobile/Media/DCIM/100APPLE/IMG_0045.JPG" 

私は再び

(lldb) print NSFileManager.defaultManager().fileExistsAtPath(clickedPicture.path!.path!) 
(Bool) $R4 = false 
(lldb) print (clickedPicture.path!.path!) 
(String) $R5 = "/var/mobile/Media/DCIM/100APPLE/IMG_0045.JPG" 
0をそれにアクセスしよう
+0

これを解消しましたか?私は同じ問題を抱えている。 – Raymond26

答えて

0

Raymond26と同様の問題を抱える他の人にお答えするには、「/var/mobile/Media/DCIM/100APPLE/IMG_0045.JPG」のように、アプリのサンドボックス外のファイルパスについて決して前提を取るべきではないことを最後に理解しました。 "

PHAsset APIを使用してこれらのファイルを読み書きする必要があります。本当にファイルパスが必要な場合は(ファイルのCライブラリを使って処理していたように)ファイルをコピーしてくださいそうする前にアプリの一時ディレクトリに移動してください。

static func copyToTemp(asset: PHAsset, desFileName: NSURL, requestedMaxSize: Int) throws 
{ 
    NSLog("copying asset to thumb for editing to: \(desFileName.path) with max size \(requestedMaxSize)") 

    // Clean temp as iOS doesnt do much overwriting in general 
    if(NSFileManager.defaultManager().fileExistsAtPath(desFileName.path!)) 
    { 
     try NSFileManager.defaultManager().removeItemAtURL(desFileName) 
    } 

    if(requestedMaxSize < 0) // No resizing, just copy 
    { 
     let options = PHImageRequestOptions() 
     options.synchronous = true 
     PHImageManager.defaultManager().requestImageDataForAsset(asset, options: options, resultHandler: { (data: NSData?, name: String?, orientation: UIImageOrientation, stuff: [NSObject: AnyObject]?) in 
      do 
      { 
       try data?.writeToURL(desFileName, options: NSDataWritingOptions.AtomicWrite) 
      } 
      catch 
      { 
       NSLog("error writing full-sized to temp: \(error)") 
      } 
     }) 
    } 
    else // Copy and resize 
    { 
     let size = CGSizeMake(CGFloat(requestedMaxSize), CGFloat(requestedMaxSize)) 
     let options = PHImageRequestOptions() 
     options.synchronous = true 
     options.deliveryMode = PHImageRequestOptionsDeliveryMode.HighQualityFormat 
     options.resizeMode = PHImageRequestOptionsResizeMode.Exact 
     PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: size, contentMode: PHImageContentMode.AspectFit, options: options, resultHandler: 
     { 
      (image: UIImage?, obj: [NSObject: AnyObject]?) -> Void in 
      do 
      { 
       try UIImageJPEGRepresentation(image!, 0.8)!.writeToURL(desFileName, options: NSDataWritingOptions.AtomicWrite) 
      } 
      catch 
      { 
       NSLog("error writing resized to temp: \(error)") 
      } 

     }) 
    } 
} 
関連する問題