2015-04-01 59 views
3

当我尝试在NSUserDefaults中保存图像时,该应用程序与此错误坠毁。当使用Swift尝试在NSUserDefaults中保存图像时发生错误

为什么?是否可以用NSUserDefaults保存图像?如果不是,那我该如何保存图像?

图像... enter image description here

代码...

var image1:UIImage = image1 


    var save1: NSUserDefaults = NSUserDefaults.standardUserDefaults() 

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

    save1.synchronize() 

登录错误...

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

回答

10

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

可以保存至NSUserDefaults什么:

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

如果您要保存其他任何内容到NSUserDefaults,通常需要将其归档到NSData对象并存储它(请记住,您以后需要时将其取消归档)。


有两种方法可将UIImage对象转换为数据。有创建图像的PNG表示或图像的JPEG表示的功能。

对于PNG:

let imageData = UIImagePNGRepresentation(yourImage) 

对于JPEG:

let imageData = UIImageJPEGRepresentation(yourImage, 1.0) 

其中第二个参数是表示压缩质量CGFloat,与0.0是最低质量和1.0为最高质量。请记住,如果您使用JPEG,则每次压缩和解压时,如果您使用的只是1.0,则会随着时间的推移而降低质量。 PNG是无损的,所以你不会降低图像。

以获取图像背出数据对象,有一个init方法UIImage做到这一点:

let yourImage = UIImage(data:imageData) 

这种方法无论工作,你如何转换的UIImage对象数据。

+0

我如何存储它一个NSData对象然后解除它的存档? – 2015-04-01 23:18:59

+0

UIImage变量 – 2015-04-01 23:21:06

+0

如何将其转换回UIImage? – 2015-04-01 23:24:39

8

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

在这里,我写了一个小代码片段迅速演示这一点。我在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") 
     } 
    } 
} 
+0

if let imgData = NSUserDefaults.standardUserDefaults()。dataForKey(“image”) – djdance 2016-01-07 20:12:56

+0

这个我已经在swift 1.0中成功试过了。但你也可以做这件事。 – 2016-01-08 06:46:44

0

更新了斯威夫特3:

如果你想保存的图像在下面的代码行节约使用UserDefault和检索图像;

要UserDefault保存图像:

if let image = response.result.value { 
      UserDefaults.standard.register(defaults: ["key":UIImageJPEGRepresentation(image, 100)!]) 
      UserDefaults.standard.set(UIImageJPEGRepresentation(image, 100), forKey: "key") 
     } 

从UserDefault检索图像并将其设置为ImageView的:

var mLogoImageView = UIImageView() 

if let imageData = UserDefaults.standard.value(forKey: "key") as? Data{ 
      let imageFromData = UIImage(data: imageData) 
      mLogoImageView.image = imageFromData! 
     } 

享受..

相关问题