2017-07-07 69 views
0

我想用userdefaults保存图像,并用此代码在另一个视图中使用它,但它显示一个错误。如何保存图像

UserDefaults.standard.set(img , forKey : "simg") 

请帮我

+2

首先,不要误用'UserDefaults'作为视图(控制器)之间的临时数据存储,其次,如果出现错误,那么'img'的类型不符合属性列表。 – vadian

+0

最好是将图像保存到文档中,然后在'UserDefaults'中保存图像的路径,这将是一件容易的事情。 –

+0

@ MoeAbdul-Hameed我该怎么做!? – MJP

回答

1

这就是我该怎么做的。您有多个地方将它保存到,用户的文档文件夹通常是最好的:

func cacheImageAsPNG(image: UIImage, localID: String) { 
    let userDocumentsURL = URL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]) 
    if let imageData = UIImagePNGRepresentation(image) { 
     let filename = userDocumentsURL.appendingPathComponent("\(localID).png") 

     if FileManager.default.createFile(atPath: filename.path, contents: imageData, attributes: nil) { 
      print("wrote file:\n\(filename.path)") 
     } else { 
      print("couldn't write the file:\n\(filename.path)") 
     } 
    } 
} 
如果你想让它由系统在高峰内存使用的时候抹去

,缓存目录是一个更好的地方:

let cachesPath = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).last! 

编辑:检索图像

func cachedImage(localID: String) -> UIImage? { 
    let userDocumentsURL = URL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]) 
    let cachePath = userDocumentsURL.appendingPathComponent("\(localID).png") 

    return UIImage(named: cachePath.path) 
} 
+0

您应该也可以展示如何从保存的文件中读取图像。 – wottle

+1

我同意。完成。我正在等待看到如何节省,所以我可以调整我的答案。但最好让答案完整。 – Mozahler

+0

@Mozahler非常感谢你这是非常有用的 – MJP

0

不能直接保存一个UIImage到NSUserDefaults。您可以将它保存为NSData,但它确实不可取。 NSUserDefaults意在存储键值对中的小部分信息。如果你开始在那里投掷图像,你可能会超载为它保留的空间。 NSUserDefaults的内容写入plist。我相信任何时候你访问用户的默认值,它都会读取整个文件。如果你在那里放大图像,会导致大量不必要的I/O。

如果你仍然决定这样做(不推荐),here是从图像中获取NSData对象的好帖子。

+0

那么你需要做什么! – MJP

+0

我在视图中拍摄图像,我想在另一个视图中显示该图像 – MJP

+1

如果您只是想要保存要在另一个视图上使用的图像,我会按照@Mozahler在其答案中所建议的方式进行操作,并将其保存到用户的文档中目录。 – wottle

0

正如其他人所说,不保存图片到用户的默认值。它仅用于小数据量。

如果您只想在另一个视图控制器中传递图像,并且您不关心在用户退出并重新启动应用程序时使图像持续存在,只需传递图像prepareForSegue即可。