尝试使用Swift在NSUserDefaults中保存图像时出错

nac*_*n f 4 nsuserdefaults uiimageview uiimage swift

当我尝试在NSUserDefaults中保存图像时,应用程序因此错误而崩溃.

为什么?是否可以使用NSUserDefaults保存图像?如果没有,那么如何保存图像?

图片... 在此输入图像描述

码...

var image1:UIImage = image1

var save1: NSUserDefaults = NSUserDefaults.standardUserDefaults()

save1.setObject(Info.Image1, forKey: "Image1")       

save1.synchronize()
Run Code Online (Sandbox Code Playgroud)

记录错误...

libc ++ abi.dylib:以NSException类型的未捕获异常终止(lldb)

nhg*_*rif 15

NSUserDefaults不仅仅是一辆大卡车,你可以扔任何你想要的东西.这是一系列只有特定类型的管子.

您可以保存到NSUserDefaults:

  • NSData
  • NSString
  • NSNumber
  • NSDate
  • NSArray
  • NSDictionary

如果您正在尝试保存其他内容NSUserDefaults,则通常需要将其存档到NSData对象并存储它(请记住,您需要在以后需要时将其取消归档).


UIImage对象转换为数据有两种方法.存在用于创建图像的PNG表示或图像的JPEG表示的功能.

对于PNG:

let imageData = UIImagePNGRepresentation(yourImage)
Run Code Online (Sandbox Code Playgroud)

对于JPEG:

let imageData = UIImageJPEGRepresentation(yourImage, 1.0)
Run Code Online (Sandbox Code Playgroud)

其中第二个参数CGFloat表示压缩质量,0.0质量最低,质量1.0最高.请记住,如果您使用JPEG,每次压缩和解压缩时,如果您使用的是其他任何东西1.0,那么随着时间的推移,您将会降低质量.PNG是无损的,因此您不会降低图像质量.

要从数据对象中恢复图像,有一种init方法UIImage可以执行此操作:

let yourImage = UIImage(data:imageData)
Run Code Online (Sandbox Code Playgroud)

无论您如何将UIImage对象转换为数据,此方法都将起作用.


Rah*_*ina 8

为了节省UIImageNSUserDefaults,你需要转换UIImageNSData使用UIImageJPEGRepresentation(image, 1)然后将其保存NSUserDefaults.而另一方面,当在另一个ViewController(在同一个应用程序中)检索它时,你需要获取NSData然后将其转换为UIImage.

在这里,我正在swift中编写小代码片段来演示这一点.我在XCODE 6.4中试过这个

/*Code to save UIImage in NSUserDefaults on viewWillDisappear() event*/

override func viewWillDisappear(animated: Bool) 
{
        super.viewWillDisappear(animated)
       //Get some image in image variable of type UIImage.
        var image = .... 
        let defaults = NSUserDefaults.standardUserDefaults()
        var imgData = UIImageJPEGRepresentation(image, 1)
        defaults.setObject(imgData, forKey: "image")

}
/*Code to get Image and show it on imageView at viewWillAppear() event*/

override func viewWillAppear(animated: Bool) 
{
    super.viewWillAppear(animated)
    let defaults = NSUserDefaults.standardUserDefaults()
    if let imgData = defaults.objectForKey("image") as? NSData
    {
        if let image = UIImage(data: imgData)
        {
            //set image in UIImageView imgSignature
            self.imgSignature.image = image
            //remove cache after fetching image data
            defaults.removeObjectForKey("image")  
        }
    }
}
Run Code Online (Sandbox Code Playgroud)