使用Swift保存图片到NSUserDefaults时出现错误

9

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

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

图像...

Xcode error

代码...

var image1:UIImage = image1

var save1: NSUserDefaults = NSUserDefaults.standardUserDefaults()

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

save1.synchronize()

记录错误...

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

4个回答

22

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 是无损的,所以不会降低图片质量。

要从数据对象中取出图像,可以使用 UIImageinit 方法:

let yourImage = UIImage(data:imageData)

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

在较新版本的Swift中,函数已更名、重新组织,并以以下方式调用:

对于PNG:

let imageData = yourImage.pngData()

对于JPEG格式:

let imageData = yourImage.jpegData(compressionQuality: 1.0)

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


8
为了将UIImage保存在NSUserDefaults中,您需要使用UIImageJPEGRepresentation(image, 1)UIImage转换为NSData,然后将其保存在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")  
        }
    }
}

如果让imgData = NSUserDefaults.standardUserDefaults().dataForKey("image") - djdance
我已经成功地在Swift 1.0中尝试过这个。但你也可以做到这件事。 - Rahul Raina

3

针对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中:
从UserDefault中获取图像,然后将其设置为ImageView。
var mLogoImageView = UIImageView() 

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

Enjoy..!


1
在 Swift 4 - 5 中,

Set:

表示为:
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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接