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

Error when trying to save image in NSUserDefaults using Swift

当我尝试在 NSUserDefaults 中保存图像时,应用程序崩溃并出现此错误。

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

图片...

代码...

var image1:UIImage = image1

var save1: NSUserDefaults = NSUserDefaults.standardUserDefaults()

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

save1.synchronize()

日志错误...

libc++abi.dylib: terminating with uncaught exception of type NSException (lldb)

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 是无损的,因此您不会降低图像质量。

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

let yourImage = UIImage(data:imageData)

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

在 Swift 的较新版本中,函数已重命名和重组,现在调用为:

对于 PNG:

let imageData = yourImage.pngData()

对于 JPEG:

let imageData = yourImage.jpegData(compressionQuality: 1.0)

尽管 Xcode 会为您自动更正旧版本

为了在NSUserDefaults中保存UIImage,您需要使用UIImageJPEGRepresentation(image, 1)UIImage转换为NSData,然后将其保存在[=12=中].另一方面,在另一个 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")  
        }
    }
}

Updated for 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!
        }

享受..!

在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
}