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

时间:2015-04-01 23:10:32

标签: swift uiimageview uiimage nsuserdefaults

当我尝试在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)

4 个答案:

答案 0 :(得分:12)

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)

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

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

let yourImage = UIImage(data:imageData)

无论您如何将UIImage对象转换为数据,此方法都将有效。

答案 1 :(得分:8)

要在UIImage中保存NSUserDefaults,您需要使用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")  
        }
    }
}

答案 2 :(得分:0)

  

针对Swift 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!
        }

享受..!

答案 3 :(得分:0)

在Swift 4-5

设置:

setImage(image: UIImage(named: "12")!)

func setImage(image : UIImage) {
    UserDefaults.standard.set(image.jpegData(compressionQuality: 100), forKey: "key")
}

获取

func getImage() -> UIImage? {
    if let imageData = UserDefaults.standard.value(forKey: "key") as? Data{
        if let imageFromData = UIImage(data: imageData){
            return imageFromData
        }
    }
    return nil
}